Проблема проектирования в случае наследования

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