如何在继承树中使用两个级别的通用基类?

时间:2010-10-05 00:50:11

标签: c# generics inheritance dto

想象一下,我有一个像这样的通用基类:

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

该类负责将传入的实体转换为DTO。

我有一个使用这个泛型类的类:

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

用户现在可以使用MammalDTO.ToDTO(mammal)Mammal转换为MammalDTO

现在我想得出哺乳动物:

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

我该怎么做?

1 个答案:

答案 0 :(得分:1)

一种解决方案是使MammalDTO成为开放但受约束的泛型类型。 然后,您可以在继承层次结构中进一步限制泛型,然后在叶子上关闭它。适当地使用抽象类也是合适的,但这不是模式的要求。

说实话,我并不喜欢“自我引用的通用”模式;我发现它很混乱。

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();
    }
}