Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5678 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 7:

Наследование и полиморфизм

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >

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

В этом примере и базовый 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, запрещено! 
}
< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2