Главная страница
Навигация по странице:

  • Контрольные вопросы

  • Индивидуальные задания

  • Список литературы

  • Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74


    Скачать 1.76 Mb.
    НазваниеЛабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
    Дата12.03.2021
    Размер1.76 Mb.
    Формат файлаdoc
    Имя файлаOOP_Lab_Rus.doc
    ТипЛабораторная работа
    #184105
    страница26 из 31
    1   ...   23   24   25   26   27   28   29   30   31

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


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

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

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

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


    Рассмотрим более практический пример, который использует переопределение метода. Следующая программа создает суперкласс с именем 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(). Интерфейс этой операции один и тот же, независимо от того, какой тип фигуры применяется.

    6.6 Использование абстрактных классов


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

    При создании собственных библиотек классов вовсе не обязательно иметь сколько-нибудь значимое определение методов в контексте их суперклассов. Управлять этой ситуацией можно двумя способами. Во-первых, можно просто выдать предупреждающее сообщение. Хотя этот подход в некоторых ситуациях, таких как отладка, может быть полезен, обычно он неприемлем. Во-вторых, существует возможность определять методы суперкласса, которые должны быть переопределены подклассом для того, чтобы приобрести для указанного подкласса определенное значение. Вы просто хотите иметь некоторый способ, гарантирующий, что подкласс действительно переопределяет все необходимые методы. Решением этой проблемы является абстрактный метод.

    Можно потребовать, чтобы некоторые методы были переопределены подклассами с помощью модификатора типа abstract. Эти методы иногда называют методами, «отданными на ответственность подклассу» (subclasser responsibility), потому что для них не определено никакой реализации в суперклассе. Таким образом, подкласс обязательно должен переопределить их – он не может просто использовать версию, определенную в суперклассе. Для объявления абстрактного метода используется следующая общая форма:
    abstract type (parameter-list);
    Обратите внимание, что тело метода отсутствует.

    Любой класс, который содержит один и более абстрактных методов, должен также быть объявлен абстрактным. Чтобы объявить абстрактный класс, просто используйте ключевое слово abstract перед ключевым словом class в начале объявления класса. Нельзя создавать никакие объекты абстрактного класса. То есть для абстрактного класса нельзя прямо создать объект с помощью операции new. Такие объекты были бы бесполезны, потому что абстрактный класс определен не полностью. Вы не можете также объявлять абстрактные конструкторы или абстрактные статические методы. Любой подкласс абстрактного масса должен или реализовать все абстрактные методы суперкласса, или сам должен быть объявлен как abstract.

    Далее показан простой пример класса с абстрактным методом, за которым следует класс, реализующий данный метод:
    // Простая демонстрация абстракций Java.

    abstract class A {

    abstract void callme();

    // в абстрактных классах допустимы обычные методы

    void callmetoo() {

    System.out.println("Это конкретный метод.");

    }

    }
    class B extends A {

    void callme() {

    System.out.println("B - реализация callme.");

    }

    }
    class AbstractDemo {

    public static void main(String args[]) {

    B b = new B();
    b.callme();

    b.callmetoo();

    }

    }
    Обратите внимание, что никакие объекты класса A не объявлены в программе. Как сказано выше, невозможно определять экземпляры (объекты) абстрактного класса. Кроме того, класс A реализует конкретный метод с именем callmetoo(). Это вполне допустимо. Абстрактные классы могут включать столько реализаций, сколько необходимо.

    Хотя абстрактные классы не могут использоваться для создания объектов, их можно использовать для создания объектных ссылок, потому что подход Java к полиморфизму времени выполнения реализован с помощью ссылок суперкласса. Таким образом, возможно создавать ссылку к абстрактному классу так, чтобы она могла использоваться для указания на объект подкласса. Вы увидите использование этого свойства в следующем примере.

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

    abstract class Figure {

    double diml;

    double dim2;

    Figure(double a, double b) {

    diml = a;

    dim2 = b;

    }

    // area теперь не абстрактный метод

    abstract double area();

    }

    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 AbstractAreas {

    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; // OK, объект не создается

    figref = r;

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

    figref = t;

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

    }

    }
    Как указывает комментарий внутри main(), больше невозможно объявлять объекты типа Figure, так как класс теперь абстрактный. Кроме того, все подклассы Figure должны переопределять area(). Чтобы доказать это, пробуйте создать подкласс, который не переопределяет агеао. Вы получите ошибку времени компиляции.

    Хотя невозможно создать объект типа Figure, можно создать ссылочную переменную типа Figure. Переменная figref объявлена как ссылка на Figure, что означает, что она может использоваться для ссылки на объект любого класса, производного от Figure. Напомним, что именно через ссылочные переменные суперкласса выбираются переопределенные методы (во время выполнения).
    Контрольные вопросы

    1. Полиморфизм понятие и определение, пример.

    2. Преимущества использования полиморфизма. Иерархия классов. Пример.

    3. Перегрузка методов при полиморфизме. Пример из других языков.

    4. Динамическая диспетчеризация методов.

    5. Переопределение методов при полиморфизме. Пример.

    6. Понятие абстрактного класса.

    7. Ограничения абстрактных классов.

    8. Абстрактные классы, пример полиморфизма.
    Индивидуальные задания

    Общая часть заданий для вариантов 1-20:

    Создать иерархию классов на основе общего абстрактного класса T.

    Написать программу, демонстрирующую работу с объектами двух типов: T1 и T2, для чего создать систему соответствующих классов. Каждый объект должен иметь идентификатор (в виде произвольной строки символов) и одно или несколько полей для хранения состояния объекта (классы является потомками T). Клиенту (функции main) должны быть доступны следующие основные операции (методы): создать объект, удалить объект, показать значение объекта и прочие дополнительные операции (зависят от варианта). Предусмотреть меню, позволяющее продемонстрировать заданные операции.

    При необходимости в разрабатываемые классы добавляются дополнительные методы (например, конструктор копирования, операция присваивания и т.п.) для обеспечения надлежащего функционирования этих классов.
    Варианты 1-10

    В табл. 3.1 и 3.2 перечислены возможные типы объектов и возможные дополнительные операции над ними.


    Таблица 3.1. Перечень типов объектов

    Класс

    Объект

    Triangle

    Треугольник

    Quadrate

    Квадрат

    Rectangle

    Прямоугольник

    Tetragon

    Четырехугольник

    Pentagon

    Пятиугольник


    Таблица 3.2 Перечень дополнительных операций (методов)

    Операция (метод)

    Описание

    Move()

    Переместить объект на плоскости

    Compare(T ob)

    Сравнить объект ob со значением класса по площади

    IsIntersect(T ob)

    Определить факт пересечения объекта ob с фигуной класса (есть пересечение или нет)

    IsInclucle(T ob)

    Определить факт включения объекта ob в объект класса



    Таблица 3.3 содержит спецификации вариантов.

    Таблица 3.3. Спецификации вариантов 1-10

    Вариант

    T1

    T2

    Операции (методы)

    1

    Triangle

    Quadrate

    Move().Compare(T)

    2

    Quadrate

    Pentagon

    Move().IsIntersect(T)

    3

    Triangle

    Rectangle

    Move().Compare(T)

    4

    Triangle

    Rectangle

    Move().IsIntersect(T)

    5

    Rectangle

    Pentagon

    Move().IsInclude(T)

    6

    Triangle

    Tetragon

    Move().Compare(T)

    7

    Triangle

    Tetragon

    Move().IsIntersect(T)

    8

    Triangle

    Tetragon

    Move().IsInclude(T)

    9

    Triangle

    Pentagon

    Move().Compare(T)

    10

    Triangle

    Pentagon

    Move().IsIntersect(T)


    Варианты 11-20

    В табл. 3.4 и 3.5 перечислены возможные типы объектов и возможные дополнительные операции над ними. В таблице рассматриваются только целые положительные числа.

    Таблица 3.4. Перечень типов объектов

    Класс

    Объект

    SymbString

    Символьная строка (произвольная строка символов)

    BinString

    Двоичцая строка (изображение двоичного числа)

    OctString

    Восьмеричная строка (изображение восьмеричного числа)

    DecString

    Десятичная строка (изображение десятичного числа)

    HexString

    Шестнадцатеричная строка (изображение шестнадцатеричного числа)


    Таблица 3.5. Перечень дополнительных операций (методов)

    Операция (метод)

    Описание

    ShowBin()

    Показать изображение двоичного значения объекта

    ShowOct()

    Показать изображение восьмеричного значения объекта

    ShowDec()

    Показать изображение десятичного значения объекта

    ShowHex()

    Показать изображение шестнадцатеричного значения объекта

    Add(Т s)

    Для объектов SymbString – конкатенация строк; для объектов прочих классов – сложение соответствующих численных значений с последующим преобразованием к типу Т

    Sub(T s)

    Для объектов SymbString – если s содержится как подстрока в строке класса, то результатом является строка, полученная удалением подстроки s; в противном случае возвращается значение s;

    для объектов прочих классов – вычитание соответствующих численных значений с последующим преобразованием к типу Т


    Примечание: Первые четыре операции могут применяться к объектам любых классов, за исключением класса SymbString.

    Здесь и далее Т — любой из типов Т1 или Т2.

    Таблица 3.6 содержит спецификации вариантов.

    Таблица 3.6. Спецификации вариантов 11-20

    Вариант

    Т1

    Т2

    Операции (методы)

    11

    SymbString

    BinString

    ShowOct(), ShowDec(), ShowHex()

    12

    SymbString

    BinString

    Add(T)

    13

    SymbString

    BinString

    Sub(T)

    14

    SymbString

    OctString

    Add(T)

    15

    SymbString

    OctString

    Sub(T)

    16

    SymbString

    DecString

    ShowBin(), ShowOct(), ShowHexO

    17

    SymbString

    DecString

    Add (T)

    18

    SymbString

    DecString

    Sub(T)

    19

    SymbString

    HexString

    Add (T)

    20

    SymbString

    HexString

    Sub(T)


    Список литературы

    1. Шилдт Г. Полный справочник по Java SE6, 2007.

    2. Эккель Б. Философия Java, 2009.

    3. Ноутон П., Шилдт Г. - Java 2. Наиболее полное руководство, 2007.

    4. Павловская Т.А., Щупак Ю.А. C++. Объектно-ориентированное программирование, 2006.

    5. Буч Г. Объектно-ориентированное проектирование с примерами применения М.: Конкорд, 1992.
    1   ...   23   24   25   26   27   28   29   30   31


    написать администратору сайта