Наследование и интерфейс
Я пытаюсь понять наследование, когда задействованы интерфейсы. Я хочу знать, как создаются подклассы, если они следуют следующему:
Например, скажем, у меня есть:
- Суперкласс, который реализует интерфейс I
- и пара подклассов, которые расширяют суперкласс A
Мои вопросы
-
Должен ли я предоставить реализацию методов интерфейса "q и r" во всех подклассах, которые расширяют A?
-
Если я не предоставляю реализацию интерфейса в подклассе, я должен сделать этот подкласс абстрактным классом?
-
Возможно ли реализовать какой-либо из подкласса I? например Класс C расширяет A реализует I, возможно ли это? даже если он уже расширяет суперкласс, который реализует I?
-
Скажем, я не предоставляю реализацию метода r из интерфейса I, тогда мне придется сделать класс суперкласса A и Abstract! это правильно?
Мой пример кода:
//superclass
public class A implements I{
x(){System.out.println("superclass x");}
y(){System.out.println("superclass y");}
q(){System.out.println("interface method q");}
r(){System.out.println("interface method r");}
}
//Interface
public Interface I{
public void q();
public void r();
}
//subclass 1
public class B extends A{
//will i have to implement the method q and r?
x(){System.out.println("called method x in B");}
y(){System.out.println("called method y in B");}
}
//subclass 2
public class C extends A{
//will i have to implement the method q and r?
x(){System.out.println("called method x in C");}
y(){System.out.println("called method y in C");}
}
Ответы
Ответ 1
1) Нет, вам не нужно реализовывать методы в подклассах, потому что они уже определены в суперклассе. Подкласс будет наследовать эти методы.
2) Нет, см. 1. Единственное исключение - если суперкласс является абстрактным и не реализует интерфейс, тогда вам потребуется реализовать его в подклассе, если подкласс не является абстрактным.
3) Нет. Он может скомпилироваться должным образом, но не будет иметь никакого эффекта, и поэтому не следует делать.
4) Да, это правильно. Если вы не реализуете метод из интерфейса, вам нужно сделать абстрактную тему.
Ответ 2
Только абстрактный класс может сохранять их абстрактными, то есть абстрактному классу не требуется предоставлять реализации методов в интерфейсе.
Так как, A
конкретный, он должен обеспечить реализации. Тогда подклассы A
просто наследуют эту реализацию от A
.
Но если A
был абстрактным и не предоставлял реализаций для методов, тогда B
и C
должны были бы обеспечить реализации.
Ответ 3
1: НЕТ, если вы имплементируете их в своем суперклассе, его не требуется реализовать в своих подклассах
2: Если вы не реализуете методы в своем суперклассе, то вы haveetomake его абстрактно, а затем создайте свои конкретные подклассы такими методами.
3: да, но абсолютно избыточно, поскольку ваш суперкласс уже реализует thrm.
4: yep, и вы должны реализовать эти методы в классе, когда расширяет ваш суперкласс
Ответ 4
Интерфейс - это обещание внешнему миру, что "я могу предоставить эти методы".
1) и 2) и 4) Так как суперкласс A уже реализует интерфейс I, он пообещал внешний мир. Суперкласс A может выполнить это обещание:
- реализация метода. В этом случае ваш подкласс уже унаследовал этот метод и ему не нужно ничего реализовывать.
- Объявление себя абстрактным - в этом случае ваш подкласс должен либо реализовать абстрактный метод, либо объявить себя абстрактным тоже и "передать доллар" до любого класса, расширяющего подкласс.
3) Все подклассы суперкласса A уже реализуют I, потому что они наследуют "обещание", поэтому класс C расширяет A реализует I, является избыточным.