2014-02-20 4 views
0

класса А: -Новый объект Создание C#

class classOne 
{ 
    public int intOne = 0; 
    public int Sub() 
    { 
     return 1; 
    } 
    public virtual int Add() 
    { 
     return 1; 
    } 
} 

Класса: -

class classTwo:classOne 
{ 
    public new int Sub() 
    { 
     return 2; 
    } 
    public override int Add() 
    { 
     return 2; 
    } 

} 

Класс Три

class classThree : classTwo 
{ 
    public int Sub() 
    { 
     return 3; 
    } 

} 

Program.cs

classOne obj = new classOne(); 
classThree obj3 = new classThree(); 
obj = obj3; 
Console.WriteLine(obj.Sub()); 

Выход равен 1.

Я сомневаюсь, что я инициализировал объект obj с классом One. Затем я назначил тот же объект с ClassThree с использованием нового ключевого слова classThree obj3 = new classThree();. Как это называется classOne.sub(). Как это происходит? Я понимаю, что он должен был назвать classThree.Sub().

ответ

1

Вы не сделали Sub виртуальным, поэтому компилятор будет использовать статический тип переменной, чтобы определить, какой экземпляр для вызова. Поскольку статический тип obj равен classOne, он будет звонить classOne.Sub()

+1

Вот почему вам пришлось использовать ключевое слово 'new' в повторном описании' Sub' во втором классе. Вы явно маскируете метод класса One. Здесь вы не используете наследование или полиморфизм. Вы должны добавить 'virtual' в объявлении One.Sub, удалить' new' в объявлении Two.Sub и добавить 'override' в объявление Two.Sub и Three.Sub – dureuill

+0

' obj = new classOne(); 'здесь мы ссылаемся на новые type to obj. В этом случае тип объекта должен изменить обряд? почему это не происходит? Почему он все еще находится в ClassOne? – Dhinesh

+0

@Dhinesh. Независимо от того, что вы назначаете 'obj', компилятор всегда будет принимать решения о вызове метода на основе статического типа' obj'. Тип выполнения используется только при вызове виртуальных методов. 'Добавить' является виртуальным, поэтому компилятор отправит правильную версию. 'Sub' не является виртуальным, поэтому компилятор всегда будет вызывать экземпляр' classOne'. – Sean

Смежные вопросы