Я бы хотел иметь метод в базовом классе C #, вызываемый для объектов нескольких производных классов, который возвращает сам объект, и пусть CLR знает, к какому типу объект на самом деле относится - т.е. , соответствующий производный тип. Может ли кто-нибудь предложить способ сделать это? Конечно, кроме ковариации возвращаемого типа, которой нет в C #.
Что-то вроде этого, за исключением того, что возвращаемый тип Method ()
должен быть типом производного класса, а не базового:
public abstract class Base {
public Base Method() { return this; }
}
public class Derived1: Base { ... }
public class Derived2: Base { ... }
public class Main {
public static int Main() {
Derived1 d1 = new Derived1();
Derived1 x = d1.Method();
Derived2 d2 = new Derived2();
Derived2 y = d2.Method();
}
}
Я могу придумать только два способа сделать эту работу, и мне не нравится ни один из них:
Приведите результат метода () к ожидаемому типу ( например, , Derived1 x = (Derived) d1.Method ();
]). Но приведение типов - это инструмент Дьявола, и, кроме того, цель метода - вернуть Derived1
или Derived2
или ..., а не Base
.
Объявить Method ()
как абстрактный в базе и реализовать его отдельно в каждом производном классе. Но это полностью противоречит идее выделения общих методов. Метод Method ()
будет идентичным в каждом случае, за исключением своего возвращаемого типа.