2015-09-12 9 views
4

Предположим, что класс Vehicle содержит метод virtual с именем CalculateMaxSpeed. Предположим, что этот метод имеет как MotorVehicle, так и Automobile классы override. Какой класс определяет метод, который вызывается, когда выполняется второй оператор в следующем коде?Полиморфизм и виртуальный метод

Vehicle (прародителем Automobile)>MotorVehicle (родитель Auatomobile)>Automobile

MotorVehicle car = new Automobile(); 
car.CalculateMaxSpeed(); 

Ну в моей точки зрения, это должно быть Automobile#CalculateMaxSpeed, но я боюсь, что это может быть MotorVehicle#CalculateMaxSpeed becasue MotorVehicle содержит экземпляр Automobile. Пожалуйста, уточните.

ответ

2

Ваше понимание неверное. Automobile#CalculateMaxSpeed. Это называется Runtime Polymorphism.

Хотя тип объекта автомобиля MotorVehicle, во время выполнения содержимое объекта будет идентифицировано как тип класса derviced, который равен Automobile. Таким образом, метод будет вызываться не по типу объекта, а по содержимому объекта.

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

0

Либо, если вы наберете ссылку с конкретным классом или базового класса, набрав не имеет ничего общего с , что называть если вы не используете идентификатор повторного использования:

public class A 
{ 
    public virtual string Text { get; set; } 
} 

public class B : A 
{ 
    // "new" keyword is identifier reusing. You're 
    // defining a new member which uses Text again and 
    // hides "Text" to references typed as B 
    new public string Text { get; set; } 
} 

public class X : A 
{ 
    public override string Text { get; set; } 
} 


B someB = new B(); 
someB.Text = "hello world"; 

// Now try to access Text property... what happened? 
// Yes, Text property is null, because you're reusing the 
// identifier in B instead of overriding it 
A someBUpcastedToA = someB; 
string text = someBUpcastedToA.Text; 

X someX = new X(); 
someX.Text = "goodbye"; 

// Now if you access someXUpcastedToA.Text 
// property it will give you the "goodbye" string 
// because you're overriding Text in X instead of 
// reusing the identifier 
A someXUpcastedToA = someX; 

В конце концов, ввод текста дает более или менее метаданные для ссылки на объект и обеспечивает доступ к текущим членам типа, но объект, хранящийся в так называемой ссылке, по-прежнему остается одним и тем же, если он более или менее типизирован.

Подумайте о вводе, как показывать или скрывать детали данного объекта:

// someX reference provides access to all X members 
X someX = new X(); 

// This is upcasting. Now it's still the X instance but 
// with access to less members. 
A a = someX; 

Переопределение только повторное использование метода или свойства подписи (т.е. public string Text) и изменение его тела в производном классе. Когда метод помечен либо виртуальным, либо аннотация, компилятор и среда выполнения знают, что это класс класса polymorphic, а время выполнения вызовет наиболее конкретную реализацию для данного полиморфного элемента. Это причина того, что ввод текста не меняет объект, помещенный в поле по ссылке.

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