Программирование >>  Обработка исключительных ситуаций 

1 ... 52 53 54 [ 55 ] 56 57 58 ... 142


Операции класса

С? позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции. Это дает возможность применять экземпляры собственных типов данных з составе выражений таким же образом, как стандартных, например:

..Object .а, Ь. с;

: = а + Ь; используется операция сложения для класса MyObject

Определение собственных операций класса часто называют перегрузкой операций. Перегрузка обычно применяется для классов, описывающих математические или физические понятия, то есть таких классов, для которых семантика операций делает программу более понятной. Если назначение операции интуитивно не понятно с первого взгляда, перегружать такую операцию не рекомендуется.

Операции класса описываются с помощью методов специального вида (функций-операций). Перегрузка операций похожа на перегрузку обычных методов. Синтаксис операции:

Г атрибуты ] спецификаторы объявительоперации тело

Атрибуты рассматриваются в главе 12, в качестве спецификаторов одновременно используются ключевые слова public и static. Кроме того, операцию можно объявить как внешнюю (extern).

Объявитель операции содержит ключевое слово operator, по которому и опознается описание операции в классе. Тело операции определяет действия, которые выполняются при использовании операции в выражении. Тело представляет собой блок, аналогичный телу других методов.

: 256

г 512

Ю24 2048 12 4096

Язык С# допускает использование многомерных индексаторов. Они описываются аналогично обычным и применяются в основном для контроля за занесением данных в многомерные массивы и выборке данных из многомерных массивов, оформленных в виде классов. Например:

-t[,] а:

Если внутри класса объявлен такой двумерный массив, то заголовок индексатора должен иметь вид

colic int this[int i, int j]



ВНИМАНИЕ

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

При описании операций необходимо соблюдать следующие правила:

операция должна быть описана как открытый статический метод класса (спецификаторы public static);

параметры в операцию должны передаваться по значению (то есть не должны предваряться ключевыми словами ref или out);

сигнатуры всех операций класса должны различаться;

типы, используемые в операции, должны иметь не меньшие права доступа, чем сама операция (то есть должны быть доступны при использовании операции).

В С# существуют три вида операций класса: унарные, бинарные и операции преобразования типа.

Унарные операции

Можно определять в классе следующие унарные операции:

+ - ! - ++ -- true false

Синтаксис объявителя унарной операции:

тип operator унарнаяоперация ( параметр )

Примеры заголовков унарных операций:

public static int operator +( MyObject m ) public static MyObject operator --( MyObject m ) public static bool operator true( MyObject m )

Параметр, передаваемый в операцию, должен иметь тип класса, для которого она определяется. Операция должна возвращать:

для операций +, ! и - величину любого типа;

для операций ++ и - - величину типа класса, для которого она определяется;

для операций true и false величину типа bool.

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

ПРИМЕЧАНИЕ-

Префиксный и постфиксный инкременты не различаются (для них может существовать только одна реализация, которая вызывается в обоих случаях).



ПРИМЕЧАНИЕ

Операции true и fal se обычно определяются для логических типов SQL, обладающих неопределенным состоянием, и не входят в число тем, рассматриваемых в этой книге.

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

добавлен конструктор, позволяющий инициализировать массив обычным массивом или серией целочисленных значений произвольного размера;

добавлена операция инкремента;

добавлен вспомогательный метод Print вывода массива;

изменена стратегия обработки ошибок выхода за границы массива;

снято требование, чтобы элементы массива принимали значения в заданном диапазоне.

Текст программы приведен в листинге 7.5.

Листинг 7.5. Определение операции инкремента для класса SafeArray using System;

namespace ConsoleApplicationi

class SafeArray

{ public SafeArray( int size )

конструктор

a = new int[size]; length - size;

public SafeArray( params int[] arr )

length = arr.Length; a = new intDength];

for ( int i = 0; i < length; ++i ) a[i]

новый конструктор

arr[i];

public static SafeArray operator + + ( SafeArray x )

SafeArray temp = new SafeArray( x.length ): for ( int i = 0; i < x.length; ++i )

temp[i] = + + x.a[i]; return temp;

public int this [int i]

индексатор



1 ... 52 53 54 [ 55 ] 56 57 58 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика