Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Индексаторы. 4.Операции класса: перегрузка унарных и бинарных операций. Унарные операции. Бинарные операции. 5.Операции класса: перегрузка операции преобразования типа.




Индексаторы

Индексатор представляет собой разновидность свойства и обычно применяется для организации доступа к скрытым полям класса по индексу.

Синтаксис индексатора аналогичен синтаксису свойства:

[атрибуты] [спецификаторы] тип this [список параметров] // последние [ ] являются элементами синтаксиса

{ [get код_доступа]

 [set код_доступа]}

Индексаторы чаще всего объявляются со спецификатором public, поскольку они входят в интерфейс объекта. Атрибуты и спецификаторы могут отсутствовать.

Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) значения некоторого элемента класса. Может отсутствовать либо часть get, либо set, но не обе одновременно.

public int this[int i] //индексатор, доступный только для чтения

{ get { if (i < =0) throw new Exception(" недопустимое значение индекса" );

else if (i==1 || i==2) return 1; }}

 

 

4. Операции класса: перегрузка унарных и бинарных операций.

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

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

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

{тело}

В качестве спецификаторов одновременно используются ключевые слова public и static.

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

В классе можно переопределять следующие унарные операции: + -! ~ ++ --, а также константы true и false. При этом, если была перегружена константа true, то должна быть перегружена и константа false, и наоборот.

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

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

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

Операции не должны изменять значение передаваемого им операнда.

public static Triangle operator ++(Triangle t)

   { t. a++;

       return t; }

public static bool operator true(Triangle t)

   { if (t. ItIsTriangle) return true;

       else return false; }

public static bool operator false(Triangle t)

   { if (! t. ItIsTriangle) return false;

       else return true; }

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

При разработке класса можно перегрузить следующие бинарные операции: + - * / % & | ^ < < > > ==! = < > < = > =.

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

1. Хотя бы один параметр, передаваемый в операцию, должен иметь тип класса, для которого она определяется.

2. Операция может возвращать величину любого типа.

3. Операции отношений определяются только парами         и обычно возвращают логическое значение.

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

тип operator бинарная_опер (параметр1, параметр 2)

public static Triangle operator *(Triangle t, int a)

   { Triangle result = new Triangle(0, 0, 0);

       result. A = t. a * a;

        return result; }

 

5. Операции класса: перегрузка операции преобразования типа.

Операции преобразования типов

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

explicit operator целевой_тип (параметр) //явное преобразование

implicit operator целевой_тип (параметр) //неявное преобразование

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

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

1. при присваивании объекта переменной целевого типа;

2. при использовании объекта в выражении, содержащем переменные целевого типа;

3. при передаче объекта в метод параметра целевого типа;

4. при явном приведении типа.

Явное преобразование выполняется при использовании операции приведения типа.

При определении операции преобразования типа следует учитывать следующие особенности:

1. тип возвращаемого значения (целевой_тип) включается в сигнатуру объявителя операции;

2. ключевые слова explicit и implicit не включаются в сигнатуру объявителя операции.

public static implicit operator string(Triangle t)

   { return " ( " + t. a. ToString() + " , " + t. b. ToString() + ", " + t. c. ToString() + " ) "; }

   public static implicit operator Triangle(string s)

   { Triangle t = new Triangle(0, 0, 0);

       string[] str = s. Split('; ');

       t. a = int. Parse(str[0]);

       t. b = int. Parse(str[1]);

       t. c = int. Parse(str[2]);

       return t; }

 

 

6. Наследование классов, пример реализации механизма наследования.

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

Наследование применяется для следующих взаимосвязанных целей:

1. исключения из программы повторяющихся фрагментов кода;

2. упрощения модификации программы;

3. упрощения создания новых программ на основе существующих.

Наследование

Класс в С# может иметь произвольное количество потомков и только одного предка. При описании класса имя его предка записывается в заголовке класса после двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System. Object. Синтаксис наследования:

[атрибуты] [спецификаторы] class имя_класса [: предки]

{ тело_класса}

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

class DemoPoint //базовый класс

{ public int x;

public int y;

public void Show()

{ Console. WriteLine(" ({0}, {1})", x, y); }}

class DemoLine: DemoPoint //производный класс

{ public int xEnd;

public int yEnd;

public void Show()

{ Console. WriteLine(" ({0}, {1})-({2}, {3})", x, y, xEnd, yEnd); }}

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...