Может ли абстрактный общий родительский класс автоматически получать дочерний (расширяющий) тип?

#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: Это не проблема компилятора — это то, что система типов недостаточно богата, чтобы выразить взаимосвязь.