один абстрактный класс (суперкласс), два подкласса, одна реализация в одном подклассе. это законно?

#java

#java

Вопрос:

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

 abstract class A {
    abstract void method();
    abstract void anothermethod();
}

class B extends A {   
    void method() {}
    void anothermethod() {}    
}

class C extends A { // is this class definition is legal?
    void sample() {}    
}
  

Ответ №1:

Только если вы пометите C как абстрактный класс. Поэтому передача своих обязанностей по реализации его подклассам.

Другим вариантом было бы расширить C на B, и, следовательно, B будет содержать реализацию, требуемую от A его подклассами.

Ответ №2:

Нет, это не законно. У вас есть конкретный класс ( C не объявленный абстрактным), расширяющий абстрактный класс, но без предоставления реализаций для его методов. Не совсем понятно, почему вы считаете, что это должно или может быть законным, и вам следует подумать, имеет ли это более широкие последствия для вашего понимания наследования в целом, чем только в этом конкретном случае.

C полностью отделен от B . Они могут иметь совершенно другое состояние — например, B может реализовать method() использование некоторого состояния, которое присутствует только в экземпляре B . Важно понимать, что экземпляр C не является экземпляром B .

Если вы хотите, чтобы он унаследовал свое поведение, вы должны создать C подкласс B вместо A .

Ответ №3:

Нет. Класс C в этом случае тоже будет абстрактным.

О чем class C extends B ?

Ответ №4:

Это абсолютно незаконно, если вы не сделаете класс «C» абстрактным, как предложил IronBlossom, или не реализуете все абстрактные методы класса «A» в классе «C».