Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоргалка исис.docx
Скачиваний:
46
Добавлен:
10.02.2015
Размер:
155.01 Кб
Скачать

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

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

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

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

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

public static int operator + (DemoArray m)

public static DemoArray operator --(DemoArray m)

public static bool operator true (DemoArray m)

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

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

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

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

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

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

public static DemoArray operator + (DemoArray a, DemoArray b)

public static bool operator == (DemoArray a, DemoArray b)

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

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

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

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

Билет №24. Переменные базового класса и производного класса. Виртуальные методы.

Переменные базового класса и производного класса

С# является языком со строгой типизацией, в нем требуется строгое соблюдение совместимости типов с учетом стандартных преобразований типов. Из чего следует, что переменная одного типа обычно не может ссылаться на объект другого ссылочного типа. За одним небольшим исключением – ссылочная переменная базового класса может ссылаться на объект любого производного класса.

class DemoPoint

{

public int x;

public int y;

public void Show()

{

Console.WriteLine("точка на плоскости: ({0}, {1})",x, y);

}

public DemoPoint (int x, int y)

{

this.x=x; this.y=y;

}

}

class DemoShape : DemoPoint

{

public int z;

new public void Show()

{

Console.WriteLine("точка в пространстве: ({0}, {1}, {2})", x, y, z);

}

public DemoShape(int x, int y, int z):base(x, y)

{

this.z=z;

}

}

class Program

{

static void Main()

{

DemoPoint point1 = new DemoPoint(0,1);

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

DemoShape pointShape = new DemoShape(2,3,4);

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

DemoPoint point2=pointShape; //допустимая операция

//ошибка - не соответствие типов указателей

//pointShape=point1;

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

//ошибка, т.к. в классе DemoPoint нет поля z

//Console.WriteLine("({0}, {1}, {2})", point2.x, point2.y, point2.z);

}

}

Ошибка возникнет и при попытке через объект point2 обратиться к методу Show. Например, point2.Show(). В этом случае компилятор не сможет определить, какой метод Show вызвать – для базового или для производного класса. Для решения данной проблемы можно воспользоваться таким понятием как полиморфизм, который основывается на механизме виртуальных методов.