Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

как правильней организовывать абстрактный класс JAVA

Вася Жоров Ученик (71), закрыт 2 года назад
ссылка абстрактного класса может ссылаться на своих наследников, но как я понял не может получать доступ к их собственным методам и полям, поэтому в абстрактном классе нужно описывать прототипы методов, а потом переопределять их в классах наследниках для удобства реализации полиморфизма, да?
Лучший ответ
Остальные ответы
Голова Робота Просветленный (36328) 4 года назад
Правильней вместо абстрактного класса описать интерфейс.
H-p AПросветленный (46828) 4 года назад
зря Sun фичу делали?
и в других языках тоже зря? или просто сама реализация поганая?
не джавист
Голова Робота Просветленный (36328) Sun тут ни при чём. В ООП должно быть наследование, поэтому оно есть в Java. Но если ты послушаешь лекции умных дядек, использовать наследование не рекомендуется. https://youtu.be/G6LJkWwZGuc?t=587 ООП развивался постепенно. Думаю, всё зависит от задачи. Недостаток вопроса - в нём нет описания задачи. Может для этой задачи наследование даёт существенные преимущества.
H-p A Просветленный (46828) 4 года назад
это-то так.
но к СВОИМ методам (РЕАЛИЗОВАННЫМ в абстрактном классе) - может.
а если таких нету и не будет - то интерфейс делай.

abstract class Weapon {
public void shoot() {
recharge();
fire();
}

abstract void recharge();
abstract void fire();
}

class Pistol extends Weapon {
@Override
void recharge() {
...
}
@Override
void fire() {
...
}
}
АндрейВысший разум (425848) 4 года назад
Вариант через интерфейсы отличается, фактически, только служебными словами. В данном примере не "чистый" интерфейс, а с дефолтным методом:

public interface Weapon {
public default void shoot() {
recharge();
fire();
}
public void recharge();
public void fire();
}

class Pistol implements Weapon {
@Override
void recharge() {
...
}
@Override
void fire() {
...
}
}

Но класс-предок может быть только один, а интерфейсов - сколько угодно.
H-p A Просветленный (46828) "Но класс-предок может быть только один, а интерфейсов - сколько угодно." в принципе, полезная инфа. спасибо. у меня именно в джаве подобный код и я его исправлю, наверное. но концепцию всего этого мне еще предстоит понять. а к работе это не имеет отношения, так что не быстро
Максим Искусственный Интеллект (198325) 4 года назад
Родительский класс не может и не должен ссылаться на своих наследников.
Вася ЖоровУченик (71) 4 года назад
то есть нужно исключить полиморфизм из языка?))
Голова Робота Просветленный (36328) У тебя в вопросе и в этом комментарии смешиваются разные вещи. "ссылка абстрактного класса может ссылаться на своих наследников" Это верно, но это не связано с вопросом. При чём тут организация абстрактного класса? Максим имеет в виду, что код базового класса не видит члены дочерних классов. И не следует писать в базовом классе такой код: if (this instanceof ChildClass) ((ChildClass)this).childMethod(); Вообще, смысл вопроса непонятен.
Angel Профи (938) 4 года назад
не используйте слово "ссылается". Это слово уже занято :-)
Ссылка в java это неявный указатель на объект. Обычно говорят что объект ссылается на другой объект. Классы наследуются. Классы могут реализовывать интерфейс. То есть в заголовке класса или его родителя есть объявление implementation КакойтоИнтерфейс. Абстрактный класс почти ничем не отличается от НЕабстрактного класса кроме парочки нюансов. Абстрактный класс может объявлять методы без реализации. Соответственно нельзя создать объект такого класса потому, что комп не знает что именно нужно сделать когда вызывается метод без реализации. Это логично. Поэтому чтобы использовать абстрактный класс, нужно создать его наследника и реализовать недостающие методы. В остальном для абстрактного класса работают все те же правила что и для обычного класса. Если все методы абстрактного класса без реализации, то лучше использовать интерфейс. Это удобнее.
Похожие вопросы