2010-06-29 4 views
1
public class Parent 
{ 
    public virtual Parent me() 
    { 
     return this; 
    } 
} 

public class Child : Parent 
{ 
} 

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

ответ

6

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

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

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

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

0

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

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

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

1

Поскольку вы не сказали ни одного дженерики ...

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

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

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

1

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

Смежные вопросы