Абстрактный интерфейс Java



Рассмотрим пример (который компилируется на java)



public abstract interface Interface {
public void interfacing();
public abstract boolean interfacing(boolean really);
}


почему необходимо, чтобы интерфейс был "объявлен" абстрактным? Есть другие правила, которые применяются с абстрактным интерфейсом?





И Наконец: Если abstract устарел, почему он включен в Java? Есть ли история для абстрактного интерфейса?

824   9  

9 ответов:

почему необходимо, чтобы интерфейс был "объявлен" абстрактным?

это не так.

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

интерфейсы и их методы неявно abstract и добавление этого модификатора не имеет никакого значения.

есть другие правила, которые применяются с абстрактным интерфейсом?

нет, применяются те же правила. Метод должен быть реализован любым (конкретным) реализующим классом.

если абстрактно устаревший, почему он включен в Java? Есть ли история для абстрактного интерфейса?

интересный вопрос. Я выкопал первый издание JLS, и даже там говорится "этот модификатор устарел и не должен использоваться в новых программах Java".

хорошо, копать еще дальше... После попадания многочисленных сломанных ссылок, мне удалось найти копию оригинала дубовый 0.2 спецификация (или "руководство"). Довольно интересно читать надо сказать,а всего 38 страниц! : -)

в разделе 5, интерфейсы, он предоставляет следующий пример:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

а на полях написано

в будущем, "=0" часть объявления методов в интерфейсах может уйти.

предполагая, что =0 заменили на abstract ключевое слово, я подозреваю, что abstract был в какой-то момент обязательно для интерфейсных методов!


статьи: Java: абстрактные интерфейсы и абстрактные методы интерфейса

это не обязательно, это необязательно, так же как public в методах интерфейса.

смотрите JLS на этом:

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1 абстрактные интерфейсы каждый интерфейс неявно абстрактен. Этот модификатор устарел и не должен использоваться в новых программах.

и

9.4 Объявления Абстрактных Методов

[...]

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

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

Не нужно объявлять интерфейс абстрактным.

точно так же, как объявление всех этих методов общедоступными (которые они уже являются, если интерфейс является общедоступным) или абстрактными (которые они уже находятся в интерфейсе) является избыточным.

но никто тебя не останавливает.

другие вещи, которые вы можете явно указать, но не нужно:

  • вызов super() в первой строке a конструктор
  • extends Object
  • реализовать унаследованные интерфейсы

есть другие правила, которые применяются с абстрактным интерфейсом?

интерфейс уже "абстрактный". Применение этого ключевого слова снова не имеет абсолютно никакого значения.

имейте в виду, что весной это имеет не академическое значение. Абстрактный интерфейс-это предупреждение разработчику не использовать его для @Autowired. Надеюсь, что весна / затмение @Autowired посмотрит на этот атрибут и предупредит/fail об использовании таких.

реальный пример: @ Service proxy под @Transnational в @ Repository нужно использовать одни и те же основные методы, однако они должны использовать разные интерфейсы, которые расширяют этот абстрактный интерфейс из-за @Autowired. (Я называю это XXXSpec интерфейс)

каждый интерфейс неявно реферат.
этот модификатор устарел и не должен использоваться в новых программах.

[Спецификация Языка Java - 9.1.1.1 abstract интерфейсы]

также обратите внимание, что методы-члены интерфейса неявно public abstract.
[Спецификация Языка Java - 9.2 Члены Интерфейса]

почему эти модификаторы неявные? Другого нет модификатор (даже не 'нет модификатора'-модификатор), что было бы полезно здесь, так что вы явно не должны вводить его.

Это не нужно. Это причуда языка.

Это не обязательно, поскольку интерфейсы по умолчанию абстрактны, поскольку все методы в интерфейсе абстрактны.

абстрактный интерфейс не так избыточен, как все, кажется, говорят, по крайней мере в теории.

интерфейс может быть расширен, как и класс. Если вы создаете иерархию интерфейса для своего приложения, у вас может быть "базовый" интерфейс, вы расширяете другие интерфейсы, но не хочу как объект сам по себе.

пример:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

вы не хотите, чтобы класс реализовывал MyBaseInterface, только два других, MMyDog и MyBoat, но оба интерфейса совместно используют интерфейс MyBaseInterface, поэтому имеют свойство "name".

Я знаю, что это своего рода академический, но я думал, что некоторые могут найти это интересным. : -)

это действительно просто "маркер" в этом случае, чтобы сигнализировать разработчикам интерфейса его не должна осуществляться самостоятельно. Я должен указать компилятор (по крайней мере, sun/ora 1.6, с которым я пробовал) компилирует класс, который реализует абстрактный интерфейс.

Ну 'абстрактный интерфейс' является лексической конструкцией:http://en.wikipedia.org/wiki/Lexical_analysis.

это требуется компилятором, вы также можете написать interface.

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

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

интерфейс-это чисто абстрактный тип данных, который представляет функции объекта, который он захватывает или представляет.

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

Если ваш конкретный класс не реализует все функции, он снова становится абстрактным, потому что у вас есть реализация вашей мысли или идеи или абстрактности , но она не завершена, вы указываете ее abstract класса.

конкретный класс будет классом / набором классов, которые полностью захватят абстрактность, которую вы пытаетесь захватить класс XYZ.

Так что шаблон

Interface--->Abstract class/Abstract classes(depends)-->Concrete class

Comments

    Ничего не найдено.