Ссылка на базовый класс наследования C # - PullRequest
4 голосов
/ 17 мая 2011
class Base
    {
        //...
        public int i = 5;
    }

class Drifted : Base
{
    //...
    public int b = 10;
}

Base ObjectOrReference = new Drifted();

Итак, Base ObjectOrReference; является ссылкой на базовый тип.Когда мы пишем Base ObjectOrReference = new Drifted();, он становится объектом, потому что, используя 'new', мы выделяем для него память?Или это все еще ссылка, и если это правда, какой тип он имеет?Прямой вопрос: «Является ли ObjectOrReference объект?»

Ответы [ 5 ]

12 голосов
/ 17 мая 2011

Это все еще ссылка, указатель на объект в куче.Он имеет тип Drifted.

Даже если ваша ссылка относится к типу Base, базовый объект - Drifted, и вместо них будут использоваться любые переопределенные члены в производном классе Drifted.на Base, даже если вы пытаетесь использовать Base.

В случае сокрытия члена с использованием синтаксиса new, если у вас есть ссылка на базовый тип, он будет обходить любые производные классыкоторые скрывают участников.

Обзор можно найти в Интернете с Googling для "Типы ссылок C #".Я просмотрел это, похоже на стоящее чтение:

http://www.albahari.com/valuevsreftypes.aspx

7 голосов
/ 17 мая 2011

Да, ObjectOrReference является объектом и допустимым объектом.

Это объект типа Drifted.Это базовая концепция объектно-ориентированного программирования, что указатель / ссылка базового класса (ObjectOrReference в вашем случае) может содержать / ссылаться на объект его производных классов (Drifted в вашем случае), поэтому это не ошибка идопустимый объект Drifted типа

7 голосов
/ 17 мая 2011
Base ObjectOrReference = new Drifted();

с этим вы создали Drifted экземпляр, но на него ссылается Base ссылочная переменная ObjectOrReference. Прямо сейчас его возможности ограничены тем, что доступно в Base. Если вы хотите, скажем, доступ int b в Drifted, вам придется привести его к Drifted

6 голосов
/ 17 мая 2011

Это и всегда будет ссылка. Думайте об объектных переменных как указатели / ссылки. Хотя фактическое создание / размещение объекта происходит в куче, ссылки создаются в пространстве локального стека.

1 голос
/ 13 июля 2012

Вы создали экземпляр объекта производного класса, но ссылаетесь на его местоположение в памяти через его ссылочный тип базового класса (ObjectOrReference).Ссылка на объект знает только член своего типа (т. Е. В своем базовом классе) и совершенно не знает о члене своего производного класса.Таким образом, вы не можете получить доступ к члену производного класса и не можете набрать приведение здесь, поскольку мы говорим о наследовании

...