Либо, если вы наберете ссылку с конкретным классом или базового класса, набрав не имеет ничего общего с , что называть если вы не используете идентификатор повторного использования:
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, а время выполнения вызовет наиболее конкретную реализацию для данного полиморфного элемента. Это причина того, что ввод текста не меняет объект, помещенный в поле по ссылке.