Наследование и интерфейс

Я пытаюсь понять наследование, когда задействованы интерфейсы. Я хочу знать, как создаются подклассы, если они следуют следующему:

Например, скажем, у меня есть:

  • Суперкласс, который реализует интерфейс 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, является избыточным.