2016-06-03 2 views
1

Почему этот код создает выход «Base class», а не «Derived2 class»?Об Inheritance

namespace TestConsoleApplication 
{ 
    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" + " "); 
     } 
    } 
    class Program 
    { 
     public static void Main(string[ ] args) 
     { 
      Derived2 d = new Derived2(); 
      d.fun(); 
     } 
    } 
} 
+2

Поскольку 'общественная пустота fun' не является виртуальным и не переопределяется в производных классах. – Blablablaster

ответ

4

Потому что вы не объявили метод публичным.

Вы сказали его шкурой оригинальное определение, а не заменить его - что он будет делать , но модификатор доступа по умолчанию частный, не общественного.

Например, при вызове метода из внутри Derived2:

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

    public void Test() 
    { 
     fun(); 
    } 
} 
class Program 
{ 
    public static void Main(string[] args) 
    { 
     Derived2 d = new Derived2(); 
     d.Test(); //Prints 'Derived2 class' 
    } 
} 

Установка его на публике действительно распечатать Derived2 в исходном примере

public new void fun() 
{ 
    Console.Write("Derived2 class" + " "); 
} 
+1

Я бы читал его навсегда, не видя, что модификаторы доступа отсутствуют. Хорошая работа. – shadow