Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Obektno-orientirovannoe_programmirovanie.doc
Скачиваний:
14
Добавлен:
19.08.2019
Размер:
271.36 Кб
Скачать

25. Виртуальные и невиртуальные методы в c#.

Функция объявляется виртуальной в базовом классе с помощью модификатора virtual. Если для производного класса требуется переопределить свой вариант данной функции, то используется ключевое слово override. Синтаксической ошибкой является одновременное использование обоих модификаторов. Ошибкой является одновременное использование модификаторов new и override.

Public class Square

{protected int side=2;

Virtual public int Area();

{return side*side;}

Public void Print()

{Console.Writeline (“S={0}”, Area());}}

Public class Cube:Square

{override public int Area()

{return 6*side*side;}}}

Square S= new Square();

s.Print();

Cube c = new Cube();

c.Print();

Результат: s=4; s=4.

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

+ Square s1 = new Square();

+ Square s2 = new Cube();

- Cube c1 = new Cube();

- Cube c2 = new Square();

Console.Writeline(…);

S1.Area() new (4); virtual/override(4)

S2.Area() new (4); virtual/override(24)

C1.Area() new (24); virtual/override(24)

(Square(c1)).Area(); new (4); virtual/override(24)

26. Приведение и проверка типов в c#.

Для проверки принадлежности объекта к какому-либо типу используется параметр is. Синтаксис записи следующий: <выражение> is <тип>. Результатом является либо true, либо false.

  1. if (s1 is Cube)

Console.Writeline(“yes”);

else Console.Writeline(“no”); результат: “no”

  1. if (s2 is Cube) результат: “yes”

  2. if (s2 is Square) результат: “yes

  3. if (s2 is Square результат: “yes”

Приведение типов доступно в C#. Различают неявное (implicit) и явное (explicit) приведение типов (type-cast(ing)). Неявное приведение: автоматически:

Int i = 78;

Long l = I;

i неявно переводится к типу long, т.к. long охватывает большое число значений.

Явное приведение:

Long l = 45;

Int i = (int)l;

Т.к. int более короткий, чем long.

Class Overl

{Public void f(int I, long l) {}

Public void f(long l, int i) {}}

Overl O = new Overl();

Int i1=14, i2=24;

O.f(i1,i2); - ошибка

O.f((long)i1,i2); - 2-ой метод

O.f(i1,i2); - 1-ый метод

Для структурных типов – это единственный способ приведения. Этот же способ работает и для ссылочных типов. Для ссылочных типов существует еще один способ. Это использование оператора as.

C1 as Square = (Square) c1

Различия есть: 1) (Cube) s1; 2) s1 as Cube

(Cube)s1 – s1 не является объектом Cube. В первом случае возникает исключительная ситуация System.InvalidCasеException. Оператор as действует по другому: сначала выполняется проверка на соответствие типов, т.е. вызывается оператор is. Если тип преобразовать невозможно, исключение не возникает, а результатом будет нулевая ссылка null.