|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 9:
Наследование в C#
Вот простой пример, когда объявление любого класса абстрактным запрещает его реализацию в объекты
using System;
namespace Test
{
// Хоть нет абстрактных методов
// и класс готов к производству объектов,
// захотели объявить абстрактным
abstract class A
{
string name = "Класс A";
public virtual void Show()
{
Console.WriteLine(name);
}
}
// Может производить объекты,
// хоть и наследует абстрактный класс
class B : A
{
string name = "Класс B";
public override void Show()
{
Console.WriteLine(name);
}
}
// Может производить объекты
class C
{
string name = "Класс C";
public void Show()
{
Console.WriteLine(name);
}
}
// Нет виртуальных функций и ничего не наследует,
// все равно можно запретить производить объекты
abstract class D
{
string name = "Класс D";
public void Show()
{
Console.WriteLine(name);
}
}
// Вызывающая сторона
class MyClass
{
public MyClass()
{
// Создаем и распечатываем объекты
// A a = new A(); a.Show(); // Ошибка компиляции!!!
B b = new B(); b.Show();
A b1 = new B(); b1.Show();// Тонкая ссылка - толстый объект
C c = new C(); c.Show();
// D d = new D(); d.Show(); // Ошибка компиляции!!!
}
}
// Запуск
class Program
{
static void Main()
{
// Настройка консоли
Console.Title = "Производить объекты
абстрактных классов запрещено";
Console.ForegroundColor = ConsoleColor.White;
Console.CursorVisible = false;
Console.WindowWidth = 60;
Console.WindowHeight = 10;
new MyClass();// Чтобы сработал конструктор
Console.ReadLine();
}
}
}
Листинг
9.19 .
Объявление класса абстрактным запрещает его реализацию
Вот результат после закомментирования выделенных строк
Запрещение классу участвовать в наследовании
Иногда разработанный класс может оказаться настолько совершенным и самодостаточным, что не предполагает никаких дальнейших усовершенствований путем новых расширений. В этом случае его можно объявить с модификатором sealed и компилятор будет пресекать все попытки использовать его в качестве базового для дальнейших расширений. При этом будет безразлично, включен ли такой класс в текущий проект в исходном виде, или существует в откомпилированном виде в подключенной к проекту библиотечной сборке.
Вот пример
using System;
namespace Test
{
// Не может иметь наследников
sealed class A
{
}
/* Чтобы быстро отменить комментарий, поставьте спереди слеш /
// Ошибка компиляции здесь!!! Запрещено наследоваться
class B : A
{
}
//*/
// Может наследоваться
class C
{
}
// Может наследоваться
class D : C
{
}
// Вызывающая сторона
class MyClass
{
public MyClass()
{
// Просто создаем объекты в управляемой куче
A a = new A(); // Создавать объекты можно,
// а наследоваться нельзя
//B b = new B();// Нет такого класса, он закомментирован
C c = new C();
D d = new D();
}
}
// Запуск
class Program
{
static void Main()
{
// Настройка консоли
Console.Title = "Запрет классу иметь наследников";
Console.ForegroundColor = ConsoleColor.White;
Console.CursorVisible = false;
Console.WindowWidth = 60;
Console.WindowHeight = 10;
new MyClass();// Чтобы сработал конструктор
Console.ReadLine();
}
}
}
Листинг
9.20 .
Запрет классу иметь наследников
