Интерфейсы и абстрактные классы
};
Подобно классу, интерфейс определяет новый тип. Это значит, что переменные можно объявлять на основе имени интерфейса:
Transation buffer;
Класс может объявить, что он реализует протокол, определенный интерфейсом. Экземпляры класса могут назначаться переменным интерфейсного типа: public class Memorization implements Transation { void writeOut (Stream s) {
// ...
};
void readFrom (Stream s) {
// ...
};
};
buffer = new Memorization ();
Как и классы, интерфейсы могут наследоваться, причем разрешается наследование от множества родительских интерфейсов. Наследование классом-потомком от класса-родителя отличается от реализации классом интерфейса, но они очень похожи, поэтому в дальнейшем мы будем использовать термин «наследование» применительно к обоим действиям.
Отдельные объектно-ориентированные языки поддерживают идею, называемую абстрактным классом (или методом), которая соответствует чему-то среднему между классом и интерфейсом. В языках Java, Ada и C#, например, класс может определять себя и один или несколько методов с помощью ключевого словa abstract. У такого метода нет тела (реализации). Дочерний класс должен реализовать абстрактные методы, прежде чем на его основе смогут создаваться объекты. Таким образом,
456 Глава 16. Объектно-ориентированное и аспектно-ориентированное программирование |
абстрактные методы могут задавать идею поведения в родительском классе, но реализация поведения обеспечивается классом-потомком: abstract class Window { abstract public void paint (); // рисовать содержимое окна |
} Весь класс может называться абстрактным, даже если в нем нет абстрактных методов. На основе абстрактного класса нельзя создать объект, но вполне допустимо рассматривать его как родительский класс в целях наследования. В языке C++ идея абстрактного метода соответствует термину «чисто виртуальный метод», который определяется с помощью следующего оператора присваивания: class Window { public: virtual void paint () = 0; // присваивание нуля делает метод чисто виртуальным }; Класс может иметь как абстрактные (чисто виртуальные), так и не абстрактные методы. Класс, в котором все методы абстрактны, соответствует идее интерфейса из языка Java. |