Он будет называться «расширяющее преобразование», потому что вы становитесь менее специфичны в отношении типа ссылок, вы расширив набор потенциальных типов. Если у вас есть ссылка Employee
, вы знаете, что вы можете использовать любую функциональность, относящуюся к этому классу, когда у вас есть ссылка Person
на тот же объект, что вы знаете только, что вы можете использовать функциональные возможности, содержащиеся в классе Person
. Если вы хотите использовать Employee
специфическую функциональность с prs
ссылки вы должны сначала бросить вашу ссылку обратно на Employee
ссылки и если prs
не на самом деле типа Employee
(возможно, это типа Customer
который также унаследован от Person
), то вы получит InvalidCastException
.
Недвижимость SurName
не исчезает, когда вы имеете дело с ссылкой Person
. Вы просто не можете получить к нему доступ, потому что он не содержится в классе Person
. В принципе, если у вас есть ссылка на тип базовых классов, вы сможете получить доступ к свойствам/методам, содержащимся в базовом классе. Не имеет значения, что на самом деле это Employee
, у вас есть ссылка Person
, поэтому объект обрабатывается соответствующим образом.
Преобразование не подходит в вашем примере. Преобразование полезно, когда вы пытаетесь работать со многими дочерними классами в общем виде. В качестве примера у меня может быть класс Person
. В дополнение к этому у меня есть Employee
, Customer
и Consultant
классы, которые наследуют его. Теперь давайте предположим, что у меня есть объект Store
, и я хочу сделать что-то вроде получения имен каждого Person
, который сейчас находится в магазине. Самый простой способ решить эту проблему - иметь List<Person>
со всеми людьми в магазине.Поскольку Employee
, Customer
и Consultant
все унаследует от Person
я мог сделать
peopleInMyStore.Add(MyEmployee);
peopleInMyStore.Add(MyCustomer);
peopleInMyStore.Add(MyConsultant);
Тогда позже я могу сделать что-то подобное;
foreach (Person p in peopleInMyStore)
{
Console.WriteLine(p.Name);
}
Эта концепция называется «полиморфизм» и можно прочитать о здесь http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
Мой пример надуманный, но это одна из главных причин, которые вы используете наследование. Чтобы дать вам реальный пример, у меня есть некоторый тестовый код, где у меня есть класс с именем ApiTestSuite
, тогда у меня около десятка классов, которые наследуют его от формы SpecificApiTestSuite
. Проект строится в исполняемый файл командной строки, вы вызываете его с параметром api (api = specificApiName), тогда я могу сделать что-то вроде;
ApiTestSuite tests;
if (args[0] == "api1")
tests = new Api1TestSuite();
else
tests = new Api2TestSuite();
tests.RunTests();
SurName все еще существует, так как вы можете видеть, что вы передали prs обратно в Employee. – redtuna