русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Ключевое слово abstract


Дата добавления: 2015-06-12; просмотров: 658; Нарушение авторских прав


Следующее важное понятие, которое необходимо рассмотреть,— ключeвoe слово abstract.

Иногда имеет смысл описать только заголовок метода, без его тела, JJ таким образом объявить, что данный метод будет существовать в этом случае. Реализацию этого метода, то есть его тело, можно описать позже.

Рассмотрим пример. Предположим, необходимо создать набор гра­фических элементов, неважно, каких именно. Например, они могут пред­ставлять собой геометрические фигуры — круг, квадрат, звезда и т.д.; или элементы пользовательского интерфейса — кнопки, поля ввода и т.д. Сей­час это не имеет решающего значения. Кроме того, существует специаль­ный контейнер, который занимается их отрисовкой. Понятно, что внеш­ний вид каждой компоненты уникален, а значит, соответствующий метод (назовем его palnt()) будет реализован в разных элементах по-разному.

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

Но как поступить с методом отрисовки? Ведь родительский класс НС представляет собой какую-либо фигуру, у него нет визуального пред­ставления. Можно объявить метод paint() в каждой компоненте незави­симо. Но тогда контейнер должен будет обладать сложной функциональ­ностью, чтобы анализировать, какая именно компонента сейчас обраба­тывается, выполнять приведение типа и только после этого вызывать нужный метод.



Именно здесь удобно объявить абстрактный метод в родительском классе. У него нет внешнего вида, но известно, что он есть у каждого наследника. Поэтому заголовок метода описывается в родительском классе, метода у каждого наследника свое, а контейнер может спокойно Пользоваться только базовым типом, не делая никаких приведений.

Приведем упрощенный пример:

// Базовая арифметическая операция abstract class Operation {

public abstract int calculate(int a, int b); }

// Сложение class Addition {public int calculate(int a, int b) { return a+b;} }

// Вычитание class Subtraction {public int calculate(int a, int b) { return a-b;} }

class Test {public static void main(String s[]) { Operation o1 = new Addition(); Operation o2 = new Subtraction();

o1.calculate(2, 3); o2.calculate(3, 5); } }

Видно, что выполнения операций сложения и вычитания в методе main() записываются одинаково.

Обратите внимание — поскольку абстрактный метод не имеет тела, после описания его заголовка ставится точка с запятой. А раз у него нет тела, то к нему нельзя обращаться, пока его наследники не опишут реали­зацию. Это означает, что нельзя создавать экземпляры класса, у которого есть абстрактные методы. Такой класс сам объявляется абстрактным.

Класс может быть абстрактным и в том случае, если у него нет абстрактных методов, но должен быть абстрактным, если такие методы есть. Разработчик может указать ключевое словоabstract в списке модификаторов класса, если хочет запретить создание эк­земпляров этого класса. Классы-наследники должны реализовать (implements) все абстрактные методы (если они есть) своего абстрактного родителя, чтобы их можно было объявлять неабстрактными и порождать от них экземпляры.

Конечно, класс не может быть одновременно abstract и final. Это же верно и для методов, кроме того, абстрактный метод не может быть private, native, static.

Сам класс может без ограничений пользоваться своими абстрактными методами.

abstract class Test {

public abstract int getX();

public abstract int getY();

pulic double getLength() {

return Math.sqrt(getX()*getX()+getY()*getY());} }

Это корректно, поскольку метод getLength() может быть вызван только у объекта. Объект может быть порожден только от неабстрактного класса, который является наследником от Test, и должен был реализовать все абстрактные методы.

По этой же причине можно объявлять переменные типа абстрактный класс. Они могут иметь значение null или ссылаться на объект, порожден­ный от неабстрактного наследника этого класса.



<== предыдущая лекция | следующая лекция ==>
Ключевые слова this и super | Объявление интерфейсов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.81 сек.