
- •Ссылки на объекты наследуемого и наследующего классов
- •Пример:
- •Пример:
- •class Demo
- •Виртуальные методы, переопределение методов
- •Виртуальные методы, переопределение методов
- •Ссылочная переменная может ссылаться на различные типы объектовмогут быть вызваны разные версии метода.
- •При определении виртуального метода
- •Пример: использование виртуального метода и его переопределенных версий.
- •//наследующий класс
- •class Demo
- •В каждом случае вызываемая версия метода определяется динамически
- •Идентификация типа во время выполнения программы
- •Оператор проверки типа is
- •public class IsTest
- •Когда нужно и можно переопределять
- •Правила переопределения методов
- •Нельзя путать переопределение и перегрузку методов.

//наследующий класс
class B1: A
{
//переопределение метода в наследующем классе
public override void show ( )
{
Console.WriteLine("метод, переопределенный в классе B1");
}
}
//наследующий класс
class B2: A
{
//переопределение метода в наследующем классе
public override void show ( )
{
Console.WriteLine("метод, переопределенный в классе B2");
}
}
11

class Demo
{
static void Main( )
{
A objA = new A ();
B1 objB1 = new B1 ();
B2 objB2 = new B2 ();
A refA;
refA = objA;
refA.show(); //версия метода из класса A
refA = objB1;
refA.show(); //версия метода из класса B1
refA = objB2;
refA.show(); //версия метода из класса B2
}
}
}
12

13

В каждом случае вызываемая версия метода определяется динамически
в зависимости от того, на какой объект ссылается переменная refA.
Выбор версии метода зависит
не от типа самой переменной,
а от ее значения – типа объекта, на который она ссылается.
Переопределять виртуальный метод не обязательно.
Если наследующий класс не имеет своей версии виртуального метода,
то используется версия наследуемого класса.
Если бы метод show не был бы переопределен, например, в классе B2,
последняя строчка вывода имела бы вид:
метод, определенный в классе A
14

Идентификация типа во время выполнения программы
Можно использовать одну и ту же переменную
для ссылки на объекты различных типов
Отсюда проблема –
определение типа объекта во время выполнения программы.
В C# есть специальные операторы:
можно проверить на принадлежность к типу,
если это так, то привести к нему
(например, для обращения к методам и свойствам именно этого типа).
15

Оператор проверки типа is
Позволяет проверить принадлежность объекта к определенному типу.
Синтаксис :
expr is type
expr – выражение, тип которого сравнивается с типом type.
Если эти типы совпадают или совместимы,
то оператор возвращает значение true,
иначе оператор возвращает значение false.
Оператор приведения типа as
Выполняет приведение к указанному типу. Если такое приведение невозможно,
это не приводит к исключительной ситуации (ошибке).
Синтаксис :
expr as type
expr – выражение, которое приводится к типу type.
Если приведение прошло успешно,
то возвращается ссылка на тип,
иначе возвращается пустая ссылка.
16

|
Данный оператор эквивалентен следующему: |
|
expr is type ? (type) expr : (type) null |
|
Пример |
Используем класс object, которому наследуют все типы.
using System;
namespace ConsoleApplication5
{
class MyClass1
{
}
class MyClass2
{
}
17

public class IsTest
{
public static void Main()
{
object [ ] myObjects = new object [6];
myObjects[0] = new MyClass1 ( );
myObjects[1] = new MyClass2 ( );
myObjects[2] = "hello";
myObjects[3] = 123;
myObjects[4] = 123.4;
myObjects[5] = null;
18

for (int i=0; i < myObjects.Length; ++i)
{
string s = myObjects [i] as string;
Console.Write ("{0}:", i);
if (s != null)
Console.WriteLine ( "'" + s + "'" );
else
Console.WriteLine ( "not a string" );
}
}
}
}
19

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