Как задать поле подкласса в композиции - PullRequest
0 голосов
/ 06 июня 2019

Я хочу установить текст в классе C с помощью стандартного установщика, но без создания нового экземпляра, например:

C c = new C();

c.setText("text")

B b = new B();

b.setC(c);

A a = new A();

a.setB(b);

Далее я хочу использовать экземпляр a в каком-то методе.

IsЕсть ли другое простое решение, чтобы сделать это без использования конструктора?

class A {  
 private B b;

// getter setter }

class B {  
 private C c; 

//getter setter }

class C {  
 private String text;

// getter seter }

1 Ответ

0 голосов
/ 07 июня 2019

Я не уверен, что вы имеете в виду. Я предполагаю, что вы хотите представить методы B и C, используя класс A. Если это так, все, что вам нужно сделать, это обернуть их методы.

public class A {
    private B b;
    ...

    public A() {
      b = new B();
      ...
    }

    public void setCText(String text) {
      b.setCText(text);
    }
...
}

Все, что вам нужно сделать - это создать экземпляр C и следовать той же схеме класса A. Тем не менее, это УЖАСНЫЙ способ сделать это.

Это нормально, когда A состоит из B (и других частей), а B состоит из C (и других частей). Что не в порядке, так это пройти все слои композиции, чтобы обновить часть целого. Вы должны использовать другие шаблоны проектирования для достижения этой цели. Например, вы можете подписаться на класс C, чтобы получать уведомления об изменениях и использовать его в качестве триггера для обновления текстового (String) поля класса.

Аналогично, если класс А должен знать, когда одна из его частей изменилась, вы можете использовать другие шаблоны. Эта проблема звучит так, как будто ее можно решить с помощью Composite Design Pattern

...