2014-10-14 3 views
0

Вопрос: есть два класса А и ВC# аннотация, подкласс, как объяснить этот результат

public abstract class A 
{ 
    public A() 
    { 
     Console.WriteLine("A"); 
    } 
    public virtual void Fun() 
    { 
     Console.WriteLine("A.Fun()"); 
    } 
} 
public class B : A 
{ 
    public B() 
    { 
     Console.WriteLine("B"); 
    } 
    public new void Fun() 
    { 
     Console.WriteLine("B.Fun()"); 
    } 

} 

Если запустить:

public void Main() 
    { 
     A a = new B(); 
     a.Fun(); 
    } 

выход:

A 
B 
A.Fun() 

Как объяснить этот результат, я знаю, что это имеет какое-то отношение к абстрактному и suclassing, но я не знаю, как объяснить. Пожалуйста помоги.

+6

Если вы хотите переопределить метод, вы можете использовать ключевое слово 'override' вместо' new'. –

+0

В случае, если вам интересно о «A» - конструктор базовых классов вызывается из 'B' в любом случае – Carsten

+0

@mikez - сделайте это ответом и объясните различия между 'new' и' override' немного - будет счастливо возвысите его – Carsten

ответ

8

Вы должны различать new и override:

  • new: Это делает непереопределение или касание унаследованный метод базы. Метод в B, обозначенный как new, вызывается только при вызове его на объект типа B (например, ((B)a).Fun()), но не при вызове экземпляра типа B, сопоставленного объекту типа A. Может использоваться по любому методу (т. Е. «Скрывать базовый метод»).
  • overridetouch Наследование и базовая функция действительно overriden. a.Func() вызовет метод, определенный в B. Может использоваться только для базовых методов, обозначенных как virtual.
Смежные вопросы