Абстрактные классы в C#

Абстрактные классы диаметрально противоположны классам sealed. Иногда необходимо спроектировать класс, единственное назначение которого — служить базовым классом. Подобного рода классы помечаются ключевым словом abstract.

Ключевое слово abstract сообщает компилятору, что назначение данного класса — служить базовым, и потому создавать экземпляры этого класса не разрешено. Вернемся к примеру GeometricShape:

1
2
3
4
5
6
7
8
9
10
11
12
public abstract class GeometricShape {
public abstract void Draw();
}
public class Circle : GeometricShape {
public override void Draw() { // Выполнить какое-то рисование
}
public class EntryPoint {
static void Main() {
Circle shape = new Circle (); // Это не будет работать!
GeometricShape shape2 = new GeometricShape();
shape.Draw();
}

Создавать объект GeometricShape сам по себе не имеет смысла, поэтому класс GeometricShape сделан абстрактным. Таким образом, если код в Main попытается создать экземпляр GeometricShape, возникнет ошибка компиляции. Ключевое слово abstract также встречается в методе GeometricShape. Draw.

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

Если вы пришли из мира С++, то можете заметить, что в С++ допускается реализация абстрактных методов. Это верно, но проектировщики С# сочли эту идею ненужной. В принципе необходимость реализации по умолчанию для абстрактного метода, кроме как в отладочных сборках, возникает редко.

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100