Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Зачем нужны переопределенные методы?



Переопределенные методы позволяют поддерживать полиморфизм времени выполнения. Полиморфизм – весьма существенная черта объектно-ориентированного программирования по одной причине: он позволяет базовому классу определять методы, которые будут общими для всех его производных классов, и, в то же время, разрешает подклассам определять специфические реализации некоторых или всех таких методов. Переопределяемые методы – это еще один способ реализации аспекта полиморфизма «один интерфейс, множественные методы». Первый способ реализации этого аспекта – перегрузка (overloading) методов.

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

Динамический (т.е. реализуемый во время выполнения) полиморфизм – это один из наиболее мощных механизмов, привносимых объектно-ориентированным проектированием для обеспечения многократного использования кода и устойчивости к ошибкам. Способность существующих кодовых библиотек вызвать методы на экземплярах новых классов без перекомпиляции и при поддержке ясного абстрактного интерфейса – чрезвычайно мощный инструмент языка Java.

Применение переопределения методов

Рассмотрим более практический пример, который использует переопределение метода. Следующая программа создает суперкласс с именем Figure, который хранит размеры различных двумерных объектов. Он также определяет метод с именем area(), который вычисляет площадь объекта. Программа определяет также два подкласса Figure. Первый – Rectangle, а второй – Triangle. Каждый из этих подклассов переопределяет area() так, чтобы он возвращал площадь прямоугольника и треугольника, соответственно.

 

// Использование полиморфизма времени выполнения.

class Figure {

double diml;

double dim2;

Figure(double a, double b) {

diml = a;

dim2 = b;

}

double area() {

System.out.println("Площадь Figure не определена."); return 0;

}

}

class Rectangle extends Figure {

Rectangle(double a, double b) {

super(a, b);

}

// переопределить area для прямоугольника

double area() {

System.out.println("Внутри Area для Rectangle.");

return diml * dim2;

}

}

class Triangle extends Figure {

Triangle(double a, double b) {

super(a, b);

}

// переопределить area для прямоугольного треугольника

double area () {

System.out.println("Внутри Area для Triangle.");

return diml * dim2 / 2;

}

}

class FindAreas {

public static void main(String args[]) {

Figure f = new Figure(10, 10);

Rectangle r = new Rectangle(9, 5);

Triangle t = new Triangle(10, 8);

Figure figref;

figref = r;

System.out.println("Площадь равна " + figref.area()); figref = t;

System.out.println("Площадь равна " + figref.area()); figref = f;

System.out.println("Площадь равна " + figref.area());

}

}

 

Вывод этой программы:

 

Внутри Area для Rectangle.

Площадь равна 45.0

Внутри Area для Triangle.

Площадь равна 40.0

Площадь Figure не определена.

Площадь равна 0.0

 

Через двойные механизмы наследования и полиморфизма времени выполнения можно определить один непротиворечивый интерфейс, который используется несколькими различными, но связанными типами объектов. В этом случае, если объект является производным от Figure-объекта, то его площадь может быть получена с помощью вызова метода area(). Интерфейс этой операции один и тот же, независимо от того, какой тип фигуры применяется.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.