c # наследование и цепочка вопросов - PullRequest
1 голос
/ 29 июня 2010
public class Parent
{
    public virtual Parent me()
    {
        return this;
    }
}

public class Child : Parent
{
}

new Child (). Me () возвращает родительский объект. Что мне нужно, чтобы он возвращал сам дочерний объект (без использования extension и generic) ??

Ответы [ 4 ]

6 голосов
/ 29 июня 2010

Метод me возвращает ссылку на фактический объект, который имеет тип Child, но тип ссылки имеет тип Parent.

Итак, у вас есть ссылка типа Parent, которая указывает на объект типа Child. Вы можете использовать это для доступа к любым членам, которые класс Child наследует от класса Parent. Чтобы получить доступ к членам класса Child, необходимо привести ссылку на тип Child:

Child c = (Child)someObject.me();

Вы можете заставить метод me возвращать ссылку Child и выполнять приведение внутри метода, но тогда, конечно, не получится вернуть ссылку на объект Parent. Если вы не используете дженерики, у каждого метода может быть только один тип возвращаемого значения. Даже если вы переопределите метод в классе Child, он все равно должен вернуть тот же тип данных, что и в классе Parent.

1 голос
/ 29 июня 2010

Так как вы сказали, что нет дженериков ...

public class Parent
{
    public virtual Parent me()
    {
        return this;
    }
}

public class Child : Parent
{
    new public Child me ()
    {
        return this;
    }
}

Кроме того, как сказал Дарин, отключен тип времени компиляции, а не реальный возвращаемый объект (экземпляр).

1 голос
/ 29 июня 2010

Нет, (new Child()).me() возвращает объект Child, но выражение имеет тип Parent.

0 голосов
/ 29 июня 2010

Нет, new Child().me() возвращает экземпляр Child:

Console.WriteLine(new Child().me()); // prints Child

Для безопасности во время компиляции вам понадобятся генерики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...