Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Наследование и new модификатор

Этот модификатор используется при объявлении класса-наследника в том случае, если надо явным образом скрыть факт наследования объявляемого члена класса.

public class MyBaseC

{

public int x;

public void Invoke();

}

Объявление члена класса Invoke в наследуемом классе скрывает метод Invoke в базовом классе:

public class MyDerivedC : MyBaseC

{

new public void Invoke();

}

А вот данное-член x не было скрыто в производном классе соответствующим членом, следовательно, остаётся доступным в производном классе.

Сокрытие имени члена базового класса в производном классе возможно в одной из следующих форм:

Константа, поле, свойство, или внедрённый в класс тип или структура скрывают ВСЕ одноименные члены базового класса.

Внедрённый в класс или структуру метод скрывает в базовом классе свойства, поля, типы, обозначенные тем же самым идентификатором. Также в базовом классе скрываются одноимённые методы с той же самой сигнатурой.

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

В производном классе одновременное использование члена базового класса и его переопределённого потомка является ошибкой.

Полное квалифицированное имя. Примеры использования

В этом примере базовый и BC и производный DC классы используют одно и то же имя для обозначения объявляемого в обоих классах члена типа int. new модификатор подчеркивает факт недоступности члена x базового класса в производном классе. Однако из производного класса всё-таки можно обратиться к переопределённому полю базового класса с использованием полного квалифицированного имени.

using System;

public class BC

{

public static int x = 55;

public static int y = 22;

}

public class DC : BC

{

new public static int x = 100; // Переопределили члена базового класса

public static void Main()

{

// Доступ к переопределённому члену x:

Console.WriteLine(x);

// Доступ к члену базового класса x:

Console.WriteLine(BC.x);

// Доступ к члену y:

Console.WriteLine(y);

}

}

В производном классе DC переопределяется вложенный класс C. В рамках производного класса легко можно создать объект-представитель вложенного переопределённого класса C. Для создания аналогичного объекта-представителя базового класса, необходимо использовать полное квалифицированное имя.

using System;

public class BC

{

public class C

{

public int x = 200;

public int y;

}

}

public class DC:BC

{

new public class C // Вложенный класс базового класса скрывается

{

public int x = 100;

public int y;

public int z;

}

public static void Main()

{

// Из производного класса виден переопределённый вложенный класс:

C s1 = new C();

// Полное имя используется для доступа к вложенному в базовый класс:

BC.C s2 = new BC.C();

Console.WriteLine(s1.x);

Console.WriteLine(s2.x);

}

}

Прекращение наследования. Sealed спецификатор

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

Если при разработке класса возникла ситуация, при котором дальнейшее совершенствование и переопределение возможностей класса в деле решения специфических задач окажется нецелесообразным (сколько можно заниматься переопределением функций форматирования), класс может быть закрыт для дальнейшего наследования. Закрытие класса обеспечивается спецификатором sealed. При этом закрываться для наследования может как класс целиком, так и отдельные его члены.

sealed class X

{

}

class Y:X // Наследование от класса X невозможно

{

}

А так закрывается для переопределения функция-член класса:

class X

{

sealed public void f0()

{

}

}

class Y:X

{

public void f0(){} // Наследование (переопределение) f0, объявленной в X запрещено!

}