Перегрузка методов лекция по ооп
Лекция по ООП 30.03.2015.
Виртуальные методы
Определение виртуального метода происходит так:
В базовом методе при описании виртуального метода используется VIRTUAL, а в производном классе, если этот метод переопределяется, то используется OVERRIDE.
Пример 1:
Class A {
public virtual int f() { return 1;}
Class B:A{ // класс В производный от класса А
public override int f() {return 2;}} // переопределение класса
Class C:A {
public override int f() {return 3;}}
public override int f() {return 4;}}
А
В С
D
Разница между виртуальными и не виртуальными методами появляется тогда, когда с объектами производных классов мы работаем с помощью ссылки на базовый класс.
Продолжение примера 1:
A a = new D();
int i = a. f();
С одной стороны виртуальный метод должен быть известен в базовом классе, а с другой стороны его описание берется из производного класса. Поэтому переменная i получит значение 4. Если бы не метод не был виртуальным, то i = 1. Невиртуальный метод определяется классом (типом) ссылки. Виртуальный метод всегда определяется типом (классом) объекта.
C c1 = new E();
C c2 = new M();
C c3 = new L (); — неправильная строчка, ошибка
A: g=1; f=2
C: f=3;
R: g=4;
E: f=5;
F: g=7;
L: g=6
f() – виртуальная, g() – невиртуальная
i1 = c1.g (); //i1 = 1
i2 = c1.f (); // i2 = 5
i3 = c2.f(); // i3 =3
i4 = c2.g (); // i4 = 1
Класс object
System. Object
Класс object считается базовым классом для всех типов, включая и структурные типы. Можно сказать, что все типы от него производны. Класс object содержит несколько виртуальных методов, которые при желании можно переопределить в другие классы.
Пример 2:
Метод ToString, определенный в класс object , возвращает полное название типа объекта, но его часто переопределяют для того, чтобы выводить специальную информацию, например: для встроенных числовых типов метод ToString возвращает значение числовой переменной, записанной в виде строки.
Рассмотрим класс «ветор». Этот класс будет содержать два поля (x, y) в которых будут записаны координаты вектора. Мы переопределим метод ToString для этого класса так, чтобы метод возвращал эти координаты.
class Vector {
public float x;
public float y;
public override string ToString()
{string s= “(“+ x. ToString() + ‘,” + y. ToString() + “)”;
return S;}
}
Ссылки типа object можно использовать при работе с любыми типами.
Преобразование типов. Операторы IS и AS
Пусть А – базовый класс, В – производный.
A a = new B();
Работая с объектом производного класса через ссылку базового класса, нам за одним исключение доступны только члены базового класса.
Для того чтобы работая через ссылку базового класса обратиться к члену производного, нам надо выполнить преобразование типов. Например, если класс В содержит поле Х, то чтобы к нему обратиться, нам надо выполнить следующее:
((B)a).x;
Вторые скобки нужны для того, чтобы преобразование типов выполнить быстрее, чем операцию доступа (ибо у операции доступа бОльший приоритет).
2 способ:
B b = (B)a;
Тогда B. x выполнится.
Если ссылки А и В не связаны наследованием, или ссылка А в данный момент не указывает на объект В, то преобразование| B b = (B)a| вызовет генерацию исключения. Для того, чтобы проверить возможность выполнения операции преобразования типов используется оператор IS.
Вид оператора:
<объект> is <тип>ж
Булев тип
true – если преобразование возможно
false –преобразование невозможно.
if (a is B) B b =(B)a;
Данная строчка спасет нас от генерации исключения, если «а» не указывает на объект типа В.
Есть ссылка а = null (нулевая), то оператор IS вернет значение false.
true – когда а указывает на объект класса В.
Оператор Is работает с любыми типами.
Оператор AS работает только со ссылочными типами. AS выполняет преобразование типов, когда это возможно, и возвращает нулевую ссылку, когда это невозможно.
B b1 = a as B
Проверка того, что ссылка b1 не получила не равна null – задача программиста.