2013-08-23 3 views
0

Я знаю, что в расширяющемся преобразовании тип данных назначения может содержать любое значение, предоставляемое типом данных источника. Я могу понять это при преобразовании типа значения , но не может быть между ссылочными типами. Возникает Мой вопрос из следующего сценария:Расширение Преобразование между ссылочными типами

public class Person 
{ 
    public string Name { get; set; } 
} 

public class Employee : Person 
{ 
    public string SurName { get; set; } 
} 
static void Main(string[] args) 
{ 
    Employee emp = new Employee { Name = "Elvin", SurName = "Mammadov" }; 
    Person prs = emp; 
} 

Как показано, Person класса предок класс Empoyee. В коде previouse я создаю ссылку Emplyee класс, а затем конвертировать Сотрудник объект в лицо. В этот момент я теряю SurName поле данных и значение.

Я хочу знать:

  1. ли countary к может содержать любое значение выражение?

  2. Почему преобразование ссылочного типа в прямой или косвенный класс или интерфейс предка является расширяющимся преобразованием?

спасибо за ответ

+0

SurName все еще существует, так как вы можете видеть, что вы передали prs обратно в Employee. – redtuna

ответ

3

Он будет называться «расширяющее преобразование», потому что вы становитесь менее специфичны в отношении типа ссылок, вы расширив набор потенциальных типов. Если у вас есть ссылка 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(); 
+0

Но я не могу получить к нему доступ. Как это было бы полезно после преобразования? Пожалуйста, объясните мне. –

+0

@ ElvinArzumanoğlu Я отредактировал некоторые дополнительные объяснения. – evanmcdonnal

+0

Большое спасибо, @evanmcdonnal. –

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