Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры C#.doc
Скачиваний:
16
Добавлен:
22.09.2019
Размер:
472.58 Кб
Скачать

19.Перегрузка операторов. Перегрузка бинарных, унарных и операторов отношений.

Перегрузка операторов. C# позволяет определить значение оператора относит. создаваемого класса. Этот пр-с наз. перегрузкой оператора. Перегружая оператор мы расширяем его использование для класса. Например: можно перезагрузить операции арифметических действий для класса Point «+» - векторное сложение, а «-»- векторное вычитание.

Перегрузку операторов можно расценивать как введение новой операции для класса и тогда экземпляры класса можно использовать в арифметических выражениях. Перегрузка операторов одно из самых мощных средств языков С++, С#.

Перегрузки операторов тесно связаны с перегрузкой методов. Для перегрузки операторов используется ключ. слово operator, позволяет сделать операторный метод, кот. определяет действие оператора, связанное с его классом. Можно перегружать унарные(операции с одним операндом) и бинарные операции (операции в которой участвует 2 операнда). Общий формат перегр.ун.опер-ра: public static тип возвр.знач operator <знак операции>(тип операнда) { //операция } Общий формат перегр.бин.опер-ра: public static тип возвр.знач operator <знак операции >(тип и имя операнда 1, тип и имя операнда 2) { //операция }

Подавляющее большинство языков программирования и Java перегрузку операторов не поддерживают требования обеспечить возможность перегрузки операторов нет и в CLS(Common Language Specification). Если в один проект собрать модули, напис. на разных языках, то перегрузка операторов не будет работать. Выход – каждому перегруженному оператору создать аналог. обычный метод. public static Point AddPoint (Point T1, Point T2)

{ return new Point (T1.x+T2.x, T1.y+T2.y); }

public static Point SSubtractPoints (T1.x+T2.x, T1.y+T2.y);

{ return new Point ( T1.x-T2.x, T1.y-T2.y); }

Перегрузка ун.опер-ров для Point: public static Point operator-(Point Ob) { return new Point(-Ob.x,Ob.y); в Main(): T2=-T2; T2.Show();

Перегрузка оператора сравнения.

Перегрузим метод System Object Equals(): public override bool Equals (object 0) { if ((Point)0).x = = this.x && ((Point)0).y = = this.y) return true;

else return false; } public override int GetflashCode()

{ return this toString().GetHashCode(); }

public static bool Operator = = (Point T1, Point T2)

{ return T1.Equals(T2); }

// перегрузка // public static bool Operator ! = (Point T1, Point T2)

{ return ! T1. Equals(T2); }

Опер-ры отношений объектов класса нужно перег-ть только парами: < и >, <= и >=, = и !=.

20. Инкапсуляция и свойства. Формат записи свойств.

Все объектно-ориентир.языки исп-т 3 базовых принципа объектно-ориентириентированного программирования:

-инкапсуляция- как данный язык скрывает внутренние особенности реализации объектов

-наследование- как данный язык обеспечивает возможность многократного использования программного кода

-полиморфизм- как данный язык позволяет интерпретировать родственные объекты унифицированным способом(это перегрузка методов и конструкторов, переопределение методов).

Одним из аспектов инкапсуляции является защита данных. Данные об объекте должны определяться как приватные (private). Это значит, что поля данных объекта (члены переменные класса) не должны быть непосредственно доступны из открытого интерфейса. Если пользователь объекта желает изменить сост.объекта, то он должен делать это косвенно, с помощью методов чтения (get()) и модификации (set()). Платформа .NET реализует принцип инкапсуляции на основе использования свойств. Свойства – специальный член класса, позволяющий получить доступ к полю данных об объекте. Для хранения свойств память не выдел. Свойства используются для инкапсуляции полей в классе, позволяя выполнять чтение и запись их значений. Свойство состоит из имени или двух блоков программного кода, называемых функциями доступа или аксессорами(для чтения - get(), для записи-set()). Имя свойства можно использовать в выражениях и в операторах присваивания как обычную переменную. Формат записи св-в: public тип_св-ва Имя_св-ва {get { // оператор чтения поля } set {// операторы модифик.поля } }

Аксессор set автоматически принимает параметр value, который содержит значение, присваиваемое свойству.

Можно создавать свойства, предназначенные только для чтения либо только для записи. Свойство не должно изменять состояние члена-переменных при вызове get-аксессоров, но компилятор не обнаружит изменения. Св-во нельзя передавать методу в качестве ref или out параметра, т.к. свойству память не выделяется. Св-ва нельзя перегружать, лучше написать новое. Можно создавать статические свойства. Преимущества св-в в том, что пользователи объекта получает возможность изменять внутренние данные и использовать свойства в выражениях.