WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Абстрактный класс через интерфейс

Абстрактный класс через интерфейс


Дата публикации: 17-03-2013

Концепция абстрактных классов и интерфейсов не является новой для Java программистов. Неопределенность возникает, когда вы должны решить, в каком случае и что лучше использовать. Цель этой статьи - избавить вас от этой неопределенности.

Как насчет того, чтобы рассмотреть различия между абстрактным классом и интерфейсом с точки зрения Java?

1. Абстрактный класс расширяется другим классом(и) для обеспечения желаемой функциональности. Интерфейс выполняется для обеспечения требуемой функциональности.
2. Абстрактный класс не обязательно имеет абстрактный метод. Все методы в интерфейсе абстрактны, то есть вы не можете определять метод в интерфейсе, вы можете только объявить его.
3. Абстрактный класс, фактически, подобен любому другому классу с одним ограничением - он не может быть экземпляром. Например, спецификаторы доступа (public, private, и т.д.) тоже обращаются к элементам абстрактного класса. В интерфейсе, все методы являются общими. Любая переменная, объявленная в интерфейсе - неявно общая, статическая, и конечная.
4. Абстрактный класс, подобно любому другому классу, может расширять только один класс. Интерфейс может расширять много интерфейсов.
5. Класс может расширять только один абстрактный класс. Класс может выполнять множественные интерфейсы.

Однако это не означает, что абстрактный класс и интерфейс совместно не используют что-нибудь. Далее показаны совпадения между ними:

1. Оба не могут быть экземплярами.
2. Оба могут использоваться как тип данных.
3. Оба могут обеспечивать константы.

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

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

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

Интерфейс также позволяет вам скрывать класс объекта. В качестве примера рассмотрите следующий код:

/** Interface to provide logging functionality. */
interface Logger {

/** Writes a log. */
void log();

}

/** The application that generates logs. */
public class MyApp implements Logger {

/** Initializes the application. */
public MyApp() {
// Fetch the data and log the details
DataFetcher df = new DataFetcher(this);
df.fetch();
}

/** Logs a message. */
public void log(String message) {
System.out.println("MyApp: " + message);
}

/** Main. */
public static void main(String[] args) {
// ...
}

}

/** Fetches data. */
class DataFetcher {

/** The logger. */
private Logger logger;

/** Initializes the fetcher. */
public DataFetcher(Logger logger) {
this.logger = logger;
}

/** Fetches the data. */
public Vector fetch() {
// Fetch data
logger.log("Data fetched");
}

}
В этом коде, основной класс MyApp выполняет функцию регистрации и использует DataFetcher для выбора некоторых данных. Обратите внимание, что он передает данные в DataFetcher так, чтобы он мог регистрировать все детали выборки. DataFetcher сохраняет регистратор, переданный в него, в элементе типа Logger. Это делает видимыми функциональные возможности регистрации MyApp для DataFetcher и таким образом, скрывает другие методы, поддерживаемые классом MyApp. Позже, регистратор используется для регистрации сообщения.
Другое использование интерфейса - это то, что он может использоваться для пометки его implementor'ов. Давайте представим это на примере - java.io.Serializable интерфейса. Этот интерфейс не требует от вас выполнения методов, он просто отмечает класс выполнения как serializable.

Так, в следующий раз вы почувствуете разницу выбора между абстрактным классом и интерфейсом. Рассмотрите вышеупомянутые пункты и сделайте правильный выбор.
Лазерная печать в типографии Белый Ветер

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)
Октябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    E. W. Dijkstra:

    "Использование COBOL калечит разум; исходя из этого, обучение этому языку должно быть признано уголовно наказуемым преступлением."

    Опрос

    Какой текстовый редактор Вы используете?

    OpenOffice
    AbiWord
    Notepad++
    UltraEdit
    PSPad
    Microsoft Office
    Microsoft Блокнот
    Другой...