У меня есть некоторые проблемы с наследованием, поскольку у меня есть группа взаимосвязанных абстрактных классов, которые необходимо переопределить вместе для создания клиентской реализации. В идеале я хотел бы сделать что-то вроде следующего:
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. Я знаю, что есть много способов обойти это, но мне больше любопытно, почему это невозможно/не реализовано на С#.
EDIT: я несколько изменил это, так как фактически использую в своем коде свойства вместо функций.
РЕДАКТИРОВАТЬ: я изменил его обратно на функции, потому что ответ применим только к этой ситуации (ковариация параметра значения функции set свойства не должна работать). Извините за колебания! Я понимаю, что многие ответы кажутся неуместными.