#c# #class #generics #inheritance
#c# #класс #общие #наследование
Вопрос:
В моем проекте c # у меня есть два абстрактных общих родительских класса, которые затем имеют несколько дочерних классов, которые их наследуют. Проблема в том, что я передаю дочерний тип родительскому общему, и это создает некоторые глупо выглядящие определения классов и методов.
Есть ли способ в общих родительских классах получить тип наследующего их класса? Поэтому вместо того, чтобы передавать type в DTOBase, объявите, что это будет тип первого дочернего элемента DTOBase.
Определения родительского класса
public abstract class DTOBase<T> : INotifyPropertyChanged, IMergeable<T>
public abstract class ModelBase<T,U> : INotifyPropertyChanged, ITrackable, IMergeable<U>
where T : DTOBase<T>
where U : ModelBase<T,U>
Примеры дочерних классов
public class MenuGroup : DTOBase<MenuGroup>
public class MenuGroup : ModelBase<DTOs.MenuGroup, MenuGroup>
Комментарии:
1. Зачем вам нужен тип наследующего класса?
2. В первом примере, DTOBase, мне нужен тип наследующего класса для определения интерфейса IMergeable.
Ответ №1:
Нет, такого рода вещи достаточно распространены, когда у вас есть отношения типа, которые невозможно легко выразить каким-либо другим способом. У меня есть нечто подобное в моем порту буферов протокола:
public interface IMessage<TMessage, TBuilder>
: IMessage<TMessage>, IMessageLite<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
Это раздражает и уродливо, но оно выполняет свою работу. Извините, что у меня нет для вас лучших новостей.
Комментарии:
1. Черт возьми. Это расстраивает, потому что я думаю, что компилятор должен иметь возможность определять эти отношения типов во время компиляции без необходимости явно сообщать об этом.
2. @Malcolmo’Hare: Это не проблема компилятора — это то, что система типов недостаточно богата, чтобы выразить взаимосвязь.