2015-06-24 3 views
3

У меня есть два класса A и B. Теперь у меня есть отношения B "has a" A. Итак, самым тривиальным для нас является композиционная картина. Теперь одно из полей B является объектом A. Задача состоит в том, что некоторые из полей A и B являются общими. Таким образом, в этом случае эти поля будут излишними. Я не могу создать абстрактный класс из общих полей и сделать A и B наследовать его, потому что они уже расширяют некоторый абстрактный класс. Какая была бы лучшая практика в этом случае?Устранение избыточности в структуре композиции java

+0

Вы говорите, что B может иметь или не иметь A. И поля являются избыточными только тогда, когда B имеет действительный A? – KDM

+0

B почти всегда имеет соответствующий A. Оба имеют общее поле, которое фактически является местоположением файла, значение которого всегда одинаково для обоих. –

+0

Извините за педантичность. Это почти всегда или всегда? – KDM

ответ

3

Если A и B не могут иметь общий базовый класс, вы не можете поместить общие поля в такой класс.

Один из способов избежать избыточности является создание третьего класса C, который содержит общие поля А и В, и пусть А и Б есть член класса C.

Такое повторное факторинга бы имеют смысл только в том случае, если общие поля имеют смысл как отдельный класс (т. е. этот класс будет представлять собой объект или концепцию реальной жизни, а не просто произвольную группу полей). В противном случае я сохраню избыточные поля.

Например, Office и Person, вероятно, не имеют общего базового класса (кроме Object), но предположим, что оба из них имеют такие свойства, как название улицы, город, почтовый индекс, и т.д ... Вы можете легко увидеть, что эти поля должны быть извлечены до класса Address.

0

Как вы сказали, что ваша А и Б класс уже переоформила с абстрактным классом, Вы можете попробовать делегировать общие поля с не общей функцией, чтобы дифференцировать его

Например

class B extends AbstractB { 
    private String myField; 
    public String getMyField(){ 
      return myField; 
    } 
} 

class A extends AbstractA { 
    private String myField; 
    private B b; 
    public A(B b){ 
     this.b = b; 
    } 
    public String getMyField(){ 
      return myField; 
    } 
    public String getMyBField(){ 
      return b.myField; 
    } 
} 
Смежные вопросы