Язык программирования C#9 и платформа .NET5
Класс
представляет продавца, который работает на условиях частичной занятости. В качестве варианта скажем, что нужно гарантировать отсутствие возможности создания подклассаPtSalesPerson. Чтобы предотвратить наследование от класса, необходимо применить ключевое словоPtSalesPerson:sealedsealed class PtSalesPerson : SalesPerson{public PtSalesPerson(string fullName, int age, int empId,float currPay, string ssn, int numbOfSales): base(fullName, age, empId, currPay, ssn, numbOfSales){}// Остальные члены класса...}Наследование с типами записей (нововведение в версии 9.0)
Появившиеся в версии C# 9.0 типы записей также поддерживают наследование. Чтобы выяснить как, отложите пока свою работу над проектом
и создайте новый проект консольного приложения по имениEmployees. Добавьте в него два файла с именамиRecordInheritanceиCar.cs, содержащими следующие определения записей:MiniVan.cs// Car.csnamespace RecordInheritance{//Car record typepublic record Car{public string Make { get; init; }public string Model { get; init; }public string Color { get; init; }public Car(string make, string model, string color){Make = make;Model = model;Color = color;}}}// MiniVan.csnamespace RecordInheritance{//MiniVan record typepublic sealed record MiniVan : Car{public int Seating { get; init; }public MiniVan(string make, string model, string color, int seating): base(make,model, color){Seating = seating;}}}Обратите внимание, что между примерами использования типов записей и предшествующими примерами применения классов нет большой разницы. Модификатор доступа
для свойств и методов ведет себя аналогично, а модификатор доступаprotectedдля типа записи запрещает другим типам записей быть производными от запечатанных типов записей. Вы также обнаружите работу с унаследованными типами записей в оставшихся разделах главы. Причина в том, что типы записей — это всего лишь особый вид неизменяемого класса (как объяснялось в главе 5). Вдобавок типы записей включают неявные приведения к своим базовым классам, что демонстрируется в коде ниже:sealedusing System;using RecordInheritance;Console.WriteLine("Record type inheritance!");Car c = new Car("Honda","Pilot","Blue");MiniVan m = new MiniVan("Honda", "Pilot", "Blue",10);Console.WriteLine($"Checking MiniVan is-a Car:{m is Car}");// Проверка, является ли MiniVan типом CarКак и можно было ожидать, проверка того, что
являетсяm, возвращаетCar, как видно в следующем выводе:trueRecord type inheritance!Checking minvan is-a car:TrueВажно отметить, что хотя типы записей представляют собой специализированные классы, вы не можете организовывать перекрестное наследование между классами и записями. Другими словами, классы нельзя наследовать от типов записей, а типы записей не допускается наследовать от классов. Взгляните на приведенный далее код; последние два примера не скомпилируются:
namespace RecordInheritance{public class TestClass { }public record TestRecord { }// Классы не могут быть унаследованы от записей// public class Test2 : TestRecord { }// Записи не могут быть унаследованы от классов// public record Test2 : TestClass { }}Наследование также работает с позиционными типами записей. Создайте в своем проекте новый файл по имени
и поместите в него следующий код:PositionalRecordTypes.csnamespace RecordInheritance{public record PositionalCar (string Make, string Model, string Color);public record PositionalMiniVan (string Make, string Model, string Color): PositionalCar(Make, Model, Color);}
