#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».