Как использовать базовый базовый класс на два уровня ниже в дереве наследования? - PullRequest
0 голосов
/ 05 октября 2010

Представьте, что у меня есть базовый базовый класс, подобный этому:

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 Ответ

1 голос
/ 05 октября 2010

Одним из решений было бы сделать 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();
    }
}
...