Abstract and Sealed Classes and Class Members



The abstract keyword enables you to create classes and class members solely for the purpose of inheritance—to define features of derived, non-abstract classes. The sealed keyword enables you to prevent the inheritance of a class or certain class members that were previously marked virtual.

Abstract Classes and Class Members

Classes can be declared as abstract. This is accomplished by putting the keyword abstract before the keyword class in the class definition. For example:

public abstract class A { // Class members here. }

An abstract class cannot be instantiated. The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share. For example, a class library may define an abstract class that is used as a parameter to many of its functions, and require programmers using that library to provide their own implementation of the class by creating a derived class.

Abstract classes may also define abstract methods. This is accomplished by adding the keyword abstract before the return type of the method. For example:

public abstract class A { public abstract void DoWork(int i); }

 


Абстрактные и запечатанные классы и члены классов

Ключевое слово abstract позволяет создавать классы и члены классов исключительно в целях наследования — для задания функций производных классов, не являющихся абстрактными. Ключевое слово sealed позволяет предотвратить наследование класса или определенных членов класса, помеченных ранее как virtual. Дополнительные сведения см. в разделе Определение абстрактных свойств.

Абстрактные классы и члены классов

Классы можно объявлять в качестве абстрактных. Для этого в определении класса необходимо перед ключевым словом class поместить ключевое слово abstract. Пример.

public abstract class A { // Class members here. }

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

Абстрактные классы могут определять абстрактные методы. Для этого перед типом возвращаемого значения метода необходимо поместить ключевое слово abstract. Пример.

public abstract class A { public abstract void DoWork(int i); }

 


Abstract methods have no implementation, so the method definition is followed by a semicolon instead of a normal method block. Derived classes of the abstract class must implement all abstract methods. When an abstract class inherits a virtual method from a base class, the abstract class can override the virtual method with an abstract method. For example:

// compile with: /target:library public class D { public virtual void DoWork(int i) {    // Original implementation. } }   public abstract class E : D { public abstract override void DoWork(int i); }   public class F : E { public override void DoWork(int i) {    // New implementation. } }

If a virtual method is declared abstract, it is still virtual to any class inheriting from the abstract class. A class inheriting an abstract method cannot access the original implementation of the method—in the previous example, DoWork on class F cannot call DoWork on class D. In this way, an abstract class can force derived classes to provide new method implementations for virtual methods.

 


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

ß----

 

 

Если виртуальный метод объявляется как абстрактный, он все равно считается виртуальным по отношению к любому классу, наследующему от абстрактного класса. Класс, наследующий абстрактный метод, не может получить доступ к исходной реализации метода — см. предыдущий пример, DoWork в классе F не может вызывать DoWork в классе D. Таким образом, абстрактный класс может принуждать производные классы предоставлять новые реализации виртуальных методов.

 


Дата добавления: 2019-03-09; просмотров: 183; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!