Чому інтерфейс не може реалізувати інший інтерфейс?


104

Що я маю на увазі:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

Я погуглив його і виявив таке :

implementsпозначає визначення реалізації для методів інтерфейсу. Однак інтерфейси не мають реалізації, тому це неможливо.

Однак інтерфейс є 100% абстрактним класом, а абстрактний клас може реалізовувати інтерфейси (100% абстрактний клас) без реалізації його методів. У чому полягає проблема, коли вона визначається як "інтерфейс"?

Детально,

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B

Відповіді:


110

implementsозначає реалізацію, коли interfaceмається на увазі оголосити просто для забезпечення interfaceне для реалізації.

100% abstract classфункціонально еквівалентний, interfaceале він також може мати реалізацію, якщо бажаєте (у цьому випадку це не залишиться 100% abstract), тому з точки зору JVM це різні речі.

Також змінна-член у 100% абстрактному класі може мати будь-який класифікатор доступу, де в інтерфейсі вони неявно public static final .


8
Як і в Java 8, інтерфейси можуть мати методи за замовчуванням, що робить їх набагато більш схожими на абстрактні класи в цьому відношенні.
forresthopkinsa

4
Дякую за останнє речення!
Дао Чжан

24

implementsозначає, що поведінка буде визначена для abstractметодів (крім абстрактних класів, очевидно), ви визначаєте реалізацію.

extends означає, що поведінка передається у спадок.

З інтерфейсами можна сказати, що один інтерфейс повинен мати таку саму поведінку, як і інший, навіть немає реальної реалізації. Ось чому має більше сенсу інтерфейс до extendsіншого інтерфейсу, а не його реалізація.


Зі сторони пам’ятайте, що навіть якщо abstractклас може визначати abstractметоди (здоровий спосіб, який робить інтерфейс), він все ще є класом і все ще повинен бути успадкований (розширений), а не реалізований.


4

Концептуально є два класи та інтерфейси "доменів". Всередині цих доменів ви завжди розширюєтесь, лише клас реалізує інтерфейс, який є свого роду "перетином кордону". Так що в основному "розширюється" інтерфейси відображають поведінку для класів. Принаймні, я думаю, що в цьому полягає логіка. Здається, не всі згодні з такою логікою (я вважаю, що це трохи надумано), і насправді немає двох технічних причин взагалі мати два різних ключових слова.


Якщо "Y подовжує X" і не запечатаний, то можливо мати інший тип "Z", який розширює "Y". Це буде правдою, чи X є інтерфейсом чи класом. Якщо "W реалізує X", тоді "V реалізує W" неможливо. Той факт, що "extends" може бути "ланцюжком" та "реализацией", не може здатися вагомою причиною наявності різних ключових слів.
supercat

2

Однак інтерфейс є 100% абстрактним класом, а абстрактний клас може реалізувати інтерфейс (100% абстрактний клас) без реалізації його методів. У чому полягає проблема, коли вона визначається як "інтерфейс"?

Це просто питання конвенції. Письменники мови java вирішили, що "розширюється" - це найкращий спосіб описати цей взаємозв'язок, тому саме цим ми всі користуємось.

Взагалі, хоча інтерфейс є "100% абстрактним класом", ми не думаємо про них таким чином. Ми зазвичай думаємо про інтерфейси як про обіцянку впровадити певні ключові методи, а не про клас, з якого слід виходити. І тому ми, як правило, використовуємо іншу мову для інтерфейсів, ніж для класів.

Як зазначають інші, є вагомі причини для вибору "розширює" над "інструменти".


Так, сер. Це питання конвенції. Багато людей намагаються логічно обґрунтувати початкові мовні обмеження мови Sun, коли це лише особиста точка зору. Якби компілятор додав інтерфейси "реалізує", я думаю, ті самі люди це також виправдали. :-)
Маленький Санті

1

Сподіваюсь, це допоможе вам трохи того, що я навчився в упс (core java) під час свого коледжу.

Реалізація позначає визначення реалізації для методів інтерфейсу. Однак інтерфейси не мають реалізації, тому це неможливо. Однак інтерфейс може розширити інший інтерфейс, що означає, що він може додавати більше методів і успадковувати його тип.

Ось приклад нижче, це моє розуміння і те, що я навчився в ой.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

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

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Тепер, якби клас реалізував цей інтерфейс, це виглядатиме так:

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

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

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Ось приклад підкласу MyAbpositeClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

0

Інтерфейс - це як абстракція, яка не забезпечує жодної функціональності. Отже, він не «реалізує», а розширює інші абстракції або інтерфейси.


-6

Інтерфейс - це клас, який містить абстрактний метод, який не може створити жоден об'єкт. Бо інтерфейс не може створити об'єкт і його не чистий клас, його не варто реалізовувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.