come posso usare una classe base generica a due livelli in un albero ereditario?

immaginate di avere una classe base generica come questa:

public abstract class AnimalDTO<TA, TB>
{
    public static TB ToDTO(TA entity)
    {
        return ConvertToDTO<TB>(entity);
    }
}

la classe è responsabile di essere in grado di convertire un’entità passata in un dto.

ho una classe che utilizza questa classe generica:

public class MammalDTO<Mammal, MammalDTO>
{
    // omitted stuff here
}

un utente può ora usare MammalDTO.ToDTO(mammal) per convertire un Mammal in un MammalDTO.

ora voglio derivare Mammal:

public class Koala<???, ???> : Mammal<???, ???>

come faccio a farlo?

EN From: How do I use a generic base class two levels down in an inheritance tree?

More similar articles:

2 Comments

  1. una soluzione sarebbe rendere MammalDTO un tipo generico aperto ma vincolato. si potrebbe quindi cercare di vincolare il generico più avanti e più lontano, come si va giù la gerarchia di eredità, chiudendola ad un foglio. può anche essere adatto ad usare classi astratte come appropriato, ma questo non è un requisito del modello.

    ad essere onesti, però, non mi piace molto il modello ‘self-reference generico’; Trovo abbastanza confusa.

    public abstract class Animal { }
    public abstract  class Mammal : Animal { }
    public sealed class Koala : Mammal { }
    
    public abstract class AnimalDTO<TAnimal, TDTO> where TAnimal : Animal
    {
        public abstract TDTO ConvertToDTO(TAnimal entity);       
    }
    
    public abstract class MammalDTO<TMammal, TMammalDTO> : AnimalDTO<TMammal, TMammalDTO>
        where TMammal : Mammal
        where TMammalDTO : MammalDTO<TMammal, TMammalDTO>{}
    
    public sealed class KoalaDTO : MammalDTO<Koala, KoalaDTO>
    {
        public override KoalaDTO ConvertToDTO(Koala entity)
        {
            throw new NotImplementedException();
        }
    }

Leave a Reply

Your email address will not be published. Required fields are marked *