#inheritance
#наследование
Вопрос:
У меня есть вопрос, связанный с дизайном, связанный с наследованием.
Class A
protected field1
protected field2
protected field3
private List<B>
Класс B должен содержать field1, field2 и field3 определенные собственные свойства.
Нормально ли, если B может быть создан как подкласс A.
Эта взаимосвязь почему-то кажется неправильной, поскольку мое требование таково: когда объект A имеет field1, field2 и field3, мы должны убедиться, что каждый объект в списке объекта A должен иметь одинаковые поля.
Есть ли какая-либо альтернатива для обеспечения этого вышеупомянутого условия.
Спасибо.
Комментарии:
1. Этого не должно быть «… что каждый объект в списке объекта B должен иметь одинаковые поля «?
Ответ №1:
Наследование — это один из вариантов. Я бы использовал его в этом случае.
Другим может быть композиция, но тогда вам нужно каким-то образом предоставить поля, что зависит от предполагаемого использования
Class B {
private A a
// Constructor
public B(A instanceOfA) {
this.a = instanceOfA
}
public setField1(value) {
this.a.field1 = value
}
...
}
Ответ №2:
Вы должны использовать композицию всегда, если между двумя классами нет строгой взаимосвязи IS-A. Дизайн с композицией намного более гибкий и поддерживаемый.
Комментарии:
1. У вас есть веская точка зрения, хотя в этом случае я бы предпочел использовать наследование, потому что это делает изменения более прозрачными. В противном случае вам также пришлось бы изменить класс B, если вы измените класс A. Кроме того, представляется обязательным, чтобы все поля были одинаковыми, поэтому я бы предположил, что это отношение «ЕСТЬ-A»