У меня возникли некоторые проблемы с наследованием, так как у меня есть группа взаимосвязанных абстрактных классов, которые должны быть переопределены вместе для создания клиентской реализации. В идеале я хотел бы сделать что-то вроде следующего:
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
Это позволило бы любому, использующему класс Dog, автоматически получать DogLegs, и любому, кто использует класс Animal, чтобы получать Legs. Проблема в том, что переопределенная функция должна иметь тот же тип, что и базовый класс, поэтому она не будет компилироваться. Я не понимаю, почему этого не следует делать, поскольку DogLeg неявно преобразуется в Leg. Я знаю, что есть много способов обойти это, но мне более любопытно, почему это невозможно / реализовано в C #.
РЕДАКТИРОВАТЬ : Я немного изменил это, так как на самом деле я использую свойства вместо функций в моем коде.
РЕДАКТИРОВАТЬ : я изменил его обратно на функции, потому что ответ относится только к этой ситуации (ковариация по параметру значения функции набора свойства не должна работать ). Извините за колебания! Я понимаю, что многие ответы кажутся неуместными.