Вы правы, что композиция над наследованием - важный принцип, о котором следует помнить; композиция часто лучше, потому что дает вам больше гибкости.
В этом смысле, на мой взгляд, абстрактный базовый класс является оправданным выбором. Подумайте над вопросом «является»: когда один класс расширяет другой класс, тогда существует отношение «есть», переходящее из подкласса в суперкласс. Ваши классы A
и B
- это то, на что вы можете подписаться, поэтому A
- это Subscribable
.
abstract class Subscribable<T> {
private SubscriptionManager<T> subscriptionManager;
protected Subscribable(SubscriptionManager<T> subscriptionManager) {
this.subscriptionManager = subscriptionManager;
}
void addSub(Subscription<T> sub) {
subscriptionManager.addSub(sub);
}
}
class A extends Subscribable<A> {
public A(SubscriptionManager<A> subscriptionManager) {
super(subscriptionManager);
}
}
class B extends Subscribable<B> {
public B(SubscriptionManager<B> subscriptionManager) {
super(subscriptionManager);
}
}
Мне интересно, что здесь правильно?
Это выбор дизайна, и редко бывает один, объективно правильный выбор - каждый выбор дизайна имеет свои преимущества и недостатки.
Некоторые языки программирования OO поддерживают mixins , которые помогают вам реализовать нечто подобное с композицией вместо наследования, но Java не очень хорошо поддерживает это.