Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 144
- Предыдущая
- 144/642
- Следующая
...// Здесь вызывается метод Draw(), определенный в классе ThreeDCircle.ThreeDCircle o = new ThreeDCircle();o.Draw();// Здесь вызывается метод Draw(), определенный в родительском классе!((Circle)o).Draw();Console.ReadLine();Правила приведения для базовых и производных классов
Теперь, когда вы умеете строить семейства взаимосвязанных типов классов, нужно изучить правила, которым подчиняются операции приведения классов. Давайте возвратимся к иерархии классов для сотрудников, созданной ранее в главе, и добавим несколько новых методов в класс
ProgramEmployeesSystem.ObjectObjectobjectstatic void CastingExamples(){ // Manager "является" System.Object, поэтому в переменной // типа object можно сохранять ссылку на Manager. object frank = new Manager("Frank Zappa", 9, 3000, 40000, "111-11-1111", 5);}В проекте
EmployeesManagerSalesPersonPtSalesPersonEmployeestatic void CastingExamples(){ // Manager "является" System.Object, поэтому в переменной // типа object можно сохранять ссылку на Manager. object frank = new Manager("Frank Zappa", 9, 3000, 40000, "111-11-1111", 5); // Manager тоже "является" Employee. Employee moonUnit = new Manager("MoonUnit Zappa", 2, 3001, 20000, "101-11-1321", 1); // PtSalesPerson "является" SalesPerson. SalesPerson jill = new PtSalesPerson("Jill", 834, 3002, 100000, "111-12-1119", 90);}Первое правило приведения между типами классов гласит, что когда два класса связаны отношением "является", то всегда можно безопасно сохранить объект производного типа в ссылке базового класса. Формально это называется неявным приведением, поскольку оно "просто работает" в соответствии с законами наследования. В результате появляется возможность строить некоторые мощные программные конструкции. Например, предположим, что в текущем классе
Programstatic void GivePromotion(Employee emp){ // Повысить зарплату... // Предоставить место на парковке компании... Console.WriteLine("{0} was promoted!", emp.Name);}Из-за того, что данный метод принимает единственный параметр типа
EmployeeEmployeestatic void CastingExamples(){ // Manager "является" System.Object, поэтому в переменной // типа object можно сохранять ссылку на Manager. object frank = new Manager("Frank Zappa", 9, 3000, 40000, "111-11-1111", 5); // Manager также "является" Employee. Employee moonUnit = new Manager("MoonUnit Zappa", 2, 3001, 20000, "101-11-1321", 1); GivePromotion(moonUnit); // PtSalesPerson "является" SalesPerson. SalesPerson jill = new PtSalesPerson("Jill", 834, 3002, 100000, "111-12-1119", 90); GivePromotion(jill);}Предыдущий код компилируется благодаря неявному приведению от типа базового класса (
EmployeeGivePromotion()frankSystem.ObjectfrankGivePromotion()object frank = new Manager("Frank Zappa", 9, 3000, 40000, "111-11-1111", 5);// Ошибка!GivePromotion(frank);Проблема в том, что вы пытаетесь передать переменную, которая объявлена как принадлежащая не к типу
EmployeeSystem.ObjectEmployee- Предыдущая
- 144/642
- Следующая
