Может ли метод базового класса возвращать это, даже в производном классе?

Я бы хотел иметь метод в базовом классе 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();
    }
}

Я могу придумать только два способа сделать эту работу, и мне не нравится ни один из них:

  1. Приведите результат метода () к ожидаемому типу ( например, , Derived1 x = (Derived) d1.Method (); ]). Но приведение типов - это инструмент Дьявола, и, кроме того, цель метода - вернуть Derived1 или Derived2 или ..., а не Base .

  2. Объявить Method () как абстрактный в базе и реализовать его отдельно в каждом производном классе. Но это полностью противоречит идее выделения общих методов. Метод Method () будет идентичным в каждом случае, за исключением своего возвращаемого типа.

9
задан svick 3 August 2014 в 15:05
поделиться