2016-03-17 4 views
0

Код:Почему новый модификатор дает мне результат базового класса после спряжения его в производном классе?

class Baseclass 
{ 
    public void Fun() 
    { 
     Console.Write("Base class" + " "); 

    } 
} 

class Derived1 : Baseclass 
{ 
    new void Fun() 
    { 
     Console.Write("Derived1 class" + " "); 

    } 

} 
class Derived2 : Derived1 
{ 
    new void Fun() 
    { 
     Console.Write("Derived2 class" + " "); 

    } 
} 

В соответствии с определением «нового» модификатор: «новое ключевое слово явно скрывает элемент, который наследуется от базового класса.». Затем, когда мы вызываем метод с новым модификатором в производном классе, он всегда должен давать результат как «Derived2 class», Но я всегда получаю вывод «Базовый класс» во всех трех условиях.

 Baseclass d1 = new Derived1(); 
     Baseclass d2 = new Derived2(); 
     Baseclass b = new Baseclass(); 
     d1.Fun(); 
     d2.Fun(); 
     b.Fun(); 

Может кто-нибудь, пожалуйста, очистить мои сомнения?

ответ

1

Он создает правильный объект, но для доступа к его конкретным свойствам вам нужно будет его перенести первым.

+0

Не могли бы вы объяснить это кратко? – Prateik

+0

Это просто полиморфизм. Вы можете назначить более конкретный класс своей базе, но тогда вы сможете получить доступ к свойствам базы. Но Объект можно отличить от его реальной формы. Пример 'var castd1 = (Derived1) d1' –

+0

Я признаю, что мой ответ частично неполный. Ответ @paolo_montgomery_russo станет причиной того, что вы каждый раз видите один и тот же вывод. –

1

Чтобы получить ожидаемое поведение, вы должны пометить метод как виртуальный в базовом классе и переопределить его в подмножестве. Вы указали все переменные в качестве базового типа, поэтому должен применяться метод базового класса.