Постановка задачи
Целью данной работы является демонстрация всех возможностей языка Java при реализации интерфейсов, изучение возможностей интерфейсов и абстрактных классов. Для того, что бы не возниколо трудностей, при рассмотрении данным вопросов на конкретном примере, определим некоторые теоритические аспекты данной темы.
Немного теории
Итак, дадим определение нескольким терминам, которые Вам прийдется не раз услышать.
Сначала я хочу напомнить определения двух важных понятий – объект икласс. Эти понятия постоянно путают. Между тем, они являются центральными в ООП. И знать различия между ними, на мой взгляд, необходимо.
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки.
Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП - полиморфизм. Абстрактный класс может содержать (и не содержать) абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Абстрактные классы представляют собой наиболее общие абстракции, то есть имеющие наибольший объем и наименьшее содержание.
Теперь определим такое понятие, как интерфейс. Интерфе́йс — семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом. Можно заметить, что интерфейс, с точки зрения реализации, — это просто чистый абстрактный класс, то есть класс, в котором не определено ничего, кроме абстрактных методов.
Так как в Java запрещено множественное наследование классов этот запрет обходится с помощью тех же интерфейсов. Интерфейсы допускают множественное наследование. Один класс при этом может удовлетворять нескольким интерфейсам сразу. В этом состоит серьезное отличие интерфейсов от обычных классов и от абстрактных классов. Интерфейсы не порождают проблем с множественным наследованием, поскольку они не содержат полей. Наследование интерфейсов действительно очень гибкое. Так, если есть два интерфейса A и B, причем B наследуется от A, то новый интерфейс C может наследоваться от них обоих. Указание наследования от A является избыточным, все элементы этого интерфейса и так будут получены по наследству через интерфейс B.
Особенности работы с интерфейсами в Java
Для демонстрации работы с интерфейсами и абстрактными классами в Java я написал демонстрационное консольное приложение, в котором я реализовал интерфейс и четыре класса. Первыйиз них является главным классом приложения, в нем реализован метод Main, который является точкой входа в программу, а так же в нем создаются объекты двух других классов.Интерфейс IShape содержит четыре метода для вычисления и получения площади и периметра фигуры. В программе так же реализован абстрактныйкласс Figure, в которой определенны поля для каждой из фигур, поле площади фигуры и поле периметра фигуры.
На основе интерфейса и абстрактного класс реализованы два класса фигур (окружность и прямоугольник). Класс Circle реализовует методы интерфейса для расчета площади фигуры и её периметра, данный класс наследует класс Figure, так же в классе переопределен метод toString().
Класс Rectangle так же реализовует методы интерфейса для расчета площади фигуры и её периметра, данный класс наследует класс Figure, так же в классе переопределен метод toString().
В главном классе продемонстрировано создание объектов этого класса, а так же продемонстрирован вызов методов объектов и результаты их работы. Ниже Вы можете ознакомится с исходным кодом этих классов.
Исходный интерфейса:
public interface IShape { public double getSquare(); public void calculateSquare(); public double getPerimeter(); public void calculatePerimeter(); }
Исходный код абстрактного класса:
public abstract class Figure { protected double square; protected double perimeter; }
Исходный код класса Circle:
public class Circle extends Figure implements IShape { private double _radius; public Circle(double radius) { _radius = radius; } @Override public double getSquare() { this.calculateSquare(); return this.square; } @Override public void calculateSquare() { this.square = Math.PI * Math.sqrt(_radius); } @Override public double getPerimeter() { calculatePerimeter(); return this.perimeter; } @Override public void calculatePerimeter() { this.perimeter = 2 * Math.PI * _radius; } @Override public String toString() { return "Parametrs this circle: Square = " + this.square + ", Perimeter = " + this.perimeter; } }
Gubsky