Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Непонятно наслед-ие если ссылка на объект от родит


Автор: Alexanp 19.4.2016, 16:06
Пример:
Код

class BaseClass { public int A;}
class DerivedClass : BaseClass {public int B;}


Подскажите чайнику как создается экземпляр класса BC: BaseClass BC = new DerivedClass();
Вопрос: BC - это ссылка на экземпляр класса BaseClass или DerivedClass ?

А этот экземпляр типа DerivedClass состоит из поля A и B. Так ведь ?
Что будет если написать BC=(DerivedClass)BC; ?  После этой операции ведь все равно не доберешься до поля B  (типа BC.B - ошибка) ?
ВС была переменной типа BaseClass. А что стало с этой переменной в результате такой операции ? Или ничего этот код не делает ?

И еще
Можно ли говорить что мы можем управлять экземпляром, созданным по коду
BaseClass BC = new DerivedClass();
с помощью переменной BC ? Т.е. мы обращаемся к полям экземпляра посредством переменной BC.
Но т.к. BC имеет тип BaseClass, то управление экземпляром получается какое-то урезанное. Мы не можем написать BC.B.
Но сделав некое "приведение типа" мы что-то можем. Вопрос: а что это такое "приведение типа" ? Это выражение ? Оно что-то возвращает ?

И еще:
Если поля в базовом классе и в производном имеют одинаковые имена, например

Код

class BaseClass { public int A;}
class DerivedClass : BaseClass {public int A;}
DerivedClass DC = new DerivedClass();


Здесь экземпляр-объект будет иметь два поля с именем A. Так ?
Как через переменную DC добраться до поля A от родительского класса ?

Автор: chupachups 20.4.2016, 10:51
Нужно хотя бы вопросы нумеровать !

Цитата

   BC - это ссылка на экземпляр класса BaseClass или DerivedClass 
   

DerivedClass, но в представлении класса BaseClass - доступны только члены этого класса.

Цитата

   А этот экземпляр типа DerivedClass состоит из поля A и B. Так ведь ?
   

Внутри памяти - да, внутри кода - нет.

Цитата

   Что будет если написать BC=(DerivedClass)BC; ? 
   

Ничего не будет, переменная не поменяет своего типа.

Цитата

   (типа BC.B - ошибка) ?
   

Да. Чтобы добраться до В надо писать:
(BC as DerivedClass).B; - это и есть  "приведение типа" 

Цитата

   class BaseClass { public int A;}
   class DerivedClass : BaseClass {public int A;}
   DerivedClass DC = new DerivedClass();
   
   Здесь экземпляр-объект будет иметь два поля с именем A. Так ?
   

Да.

Цитата

   Как через переменную DC добраться до поля A от родительского класса ?
   

Проверь код:
Код

DerivedClass DC = new DerivedClass();
BaseClass BC = DC;
DC.A = 3;
BC.A = 5;
System.Diagnostics.Debug.WriteLine($"BC.A = {BC.A}");
System.Diagnostics.Debug.WriteLine($"DC.A = {DC.A}");

Получишь:
BC.A = 5
DC.A = 3


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Neponyatno-nasled-iye-esli-ssylka-na-obyekt-ot-rodit-id57162defae20150d358b4567#findElement_E7045_57173510ae20153e5df9a037_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)