Игнорируя тот факт, что унаследованные классы обычно расширяют базовые классы, в приведенных простых примерах определяются два разных типа записей, которые имеют те же самые свойства. В случае создания экземпляров с одинаковыми значениями для свойств они не пройдут проверку на предмет эквивалентности из-за того, что принадлежат разным типам. В качестве примера рассмотрим показанный далее код и результаты его выполнения:
MotorCycle mc = new MotorCycle("Harley","Lowrider");
Scooter sc = new Scooter("Harley", "Lowrider");
Console.WriteLine($"MotorCycle and Scooter are equal: {Equals(mc,sc)}");
Вот вывод:
Record type inheritance!
MotorCycle and Scooter are equal: False
Реализация модели включения/делегации
Вам уже известно, что повторное использование кода встречается в двух видах. Только что было продемонстрировано классическое отношение "является". Перед тем, как мы начнем исследование третьего принципа ООП (полиморфизма), давайте взглянем на отношение "имеет" (также известное как
Employees и создайте новый файл по имени BenefitPackage.cs. Поместите в него следующий код, моделирующий пакет льгот для сотрудников:namespace Employees
{
// Этот новый тип будет функционировать как включаемый класс.
class BenefitPackage
{
// Предположим, что есть другие члены, представляющие
// медицинские/стоматологические программы и т.п.
public double ComputePayDeduction
{
return 125.0;
}
}
}
Очевидно, что было бы довольно странно устанавливать отношение "является" между классом BenefitPackage
Employee следующим образом:// Теперь сотрудники имеют льготы.
partial class Employee
{
// Contain a BenefitPackage object.
protected BenefitPackage EmpBenefits = new BenefitPackage;
...
}
На данной стадии вы имеете объект, который благополучно содержит в себе другой объект. Тем не менее, открытие доступа к функциональности содержащегося объекта внешнему миру требует делегации.
Например, вы могли бы изменить класс Employee
EmpBenefits с применением специального свойства, а также использовать его функциональность внутренне посредством нового метода по имени GetBenefitCost:partial class Employee
{
// Содержит объект BenefitPackage.
protected BenefitPackage EmpBenefits = new BenefitPackage;
// Открывает доступ к некоторому поведению, связанному со льготами.
public double GetBenefitCost
=> EmpBenefits.ComputePayDeduction;
// Открывает доступ к объекту через специальное свойство.
public BenefitPackage Benefits
{
get { return EmpBenefits; }
set { EmpBenefits = value; }
}
}
В показанном ниже обновленном коде верхнего уровня обратите внимание на взаимодействие с внутренним типом BenefitsPackage
Employee:Console.WriteLine("***** The Employee Class Hierarchy *****\n");
...
Manager chucky = new Manager("Chucky", 50, 92, 100000, "333-23-2322", 9000);
double cost = chucky.GetBenefitCost;
Console.WriteLine($"Benefit Cost: {cost}");
Console.ReadLine;
Определения вложенных типов
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT