Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика ГОС - Full version2.docx
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
1.11 Mб
Скачать

15. Перегрузка методов и конструкторов как механизм реализации полиморфизма. Перегрузка операторов. Перегрузка бинарных, унарных оп-й и операторов отношений.

Существование в классе методов с одним и тем же именем называется перегрузкой, а сами одноименные методы называются перегруженными.

Перегрузка методов – один из способов реализации полиморфимзма в С# (один интерфейс – множество методов). Все перегруженные методы должны иметь списки параметров, которые отличаются по типу и количеством. Перегрузка методов полезна, когда требуется решать подобные задачи с разным набором аргументов. Типичный пример - это нахождение площади треугольника. Площадь можно вычислить по трем сторонам, по двум сторонам и углу между ними и при многих других наборах аргументов. Считается удобным во всех случаях иметь для метода одно имя, например Square, и всегда, когда нужно вычислить площадь, не задумываясь, вызывать метод Square, передавая ему известные в данный момент аргументы.

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

Перегрузка операторов. С# позволяет определить значение оператора относительно создаваемого класса. Эта процедура называется перегрузкой оператора. Перегружая оператор мы расширяем его использование для классов. Перегрузка характерна для знаков операций. В зависимости от типов аргументов, один и тот же знак может выполнять фактически разные операции. Классическим примером является знак операции сложения +, который играет роль операции сложения не только для арифметических данных разных типов, но и выполняет конкатенацию строк. Перегрузка операторов – одно из самых мощных средств С#. Для перегрузки операторов используется ключевое слово operator, позволяющее создать операторный метод, который определяет действие оператора связанное с его классом. две формы методов operatorодна для унарных операций (ob1=-ob1; ob++), другая для бинарных операций (ob3=ob1+ob2). Общий формат перегрузки для унарного оператора: public static тип_возв_значения operator op (тип операнда) {//операция}. Общий формат перегрузки для бинарного оператора: public static тип_возв_значения operator op (тип операнда1, тип операнда2) {//операции} Здесь op это: «+», «–»,«*» и тд.

Также можно перегружать операторы отношений («= =» и «!=»,«<» и «>»,«<=» и «>=»), данные операторы перегружаются парами.

16. Наслед. В c#: наслед., базовые и производн. Классы. Доступы к членам базовых классов. Конструкторы и наслед-е. Вирт. Методы и их переопределение. Абстр. Классы.

Наследование – возможность передачи данных и средств исполнения методов (от родительского объекта).

Наследование бывает двух видов: классическое(отношение подчинения) и модель локализации / делегирования (отношение локализации), когда объект уже не является уточненной версией другого объекта, а содержит в себе другой объект.

Наследование часто применять не нужно, а лишь там где оно оправдано (там где есть общая часть для всех классов).

Классическое наследование. Класс который наследуется называется базовым. Класс который наследует – производным. Производный класс – это специализированная версия базового. При объявлении производного класса после его имени записывается «:» и имя базового класса.

Доступ к членам класса. Члены-переменные класса нужно определять как Private(закрытые), чтобы не нарушать принцип инкапсуляции. Закрытый член класса остается закрытым в рамках этого класса. К нему нельзя получить доступ из кода определенного вне этого класса. Есть 2 способа решения проблемы доступа к закрытым членам базового класса:

  1. использовать уровень доступа Protected (защищенный);

  2. использовать открытые свойства и методы Public, позволяющие получить доступ к закрытым членам класса.

Конструкторы и наследование. В иерархии классов как базовые, так и производные могут иметь собственные конструкторы. Конструктор базового класса создает часть объекта соответствующую базовому классу, а конструктор производного класса создает часть соот-ую производному классу.

Если конструктор определяется только в производном классе, то просто создается объект производственного класса. Если конструкторы определены и в базовом и в производном классах, то процесс создания объектов усложняется. В этом случае используется ключевое слово base, которое имеет 2 назначения: вызвать конструктор базового класса и получить доступ к члену базового класса, который скрыт за членом производного класса.

Чтобы вызвать конструктор определяемый в базовом классе, необходимо объявить кон-р производного класса: Констр-р произв-го класса(список параметров): base(список аргументов) { //тело конструктора }

Ключевое слово base всегда отсылает к базовому классу стоящему в иерархии непосредственно над вызывающим классом. Если в иерархии классов конструктору базового класса требуются параметры, то все производные классы должны передавать эти параметры, даже если они не нужны самому производному классу.

В иерархии классов конструкторы вызываются в следующем порядке: сначала работает конструктор базового класса, а затем конструктор производного.

Виртуальные м-ды и их переопределение. Виртуальным наз. м-д, объявляемый с помощью ключевого слова virtual в базовом классе и переопределяемый в производных классах. При переопределении виртуального метода в производном классе использ-ся модификатор override. Переопределение виртуального метода в произвольном классе называют ещё замещение м-да.

Абстрактные классы. Иногда создают класс определяющий своего рода пустой бланк, а производные классы должны заполнять этот бланк своей информацией. Такой класс называют абстрактным. В нем лишь сказано какие будут методы, а реализации их нет. Можно создавать и абстрактные методы, которые пишутся с модификатором abstract. Абстр-е методы автоматически становятся виртуальными. Примечания: 1) абстр-ми могут быть только обычные методы, а не статические. 2) Св-ва могут быть абстрактными, так же как и виртуальными. 3) Класс содержащий 1 или несколько абстрактных методов объявляется как абстрактный (перед словом class нужно написать abstract). 4) Нельзя создавать с помошью new ссылочные переменные абстрактного класса, т.к. он полностью не реализуем.