Составной шаблон проектирования, пусть child (составной) знает, кто его родитель - PullRequest
0 голосов
/ 19 октября 2018

Так что я застрял в этом некоторое время.По сути, я хочу, чтобы составной компонент знал своего родителя.Когда я пытался получить доступ к родительскому объекту в параметре, он выдает мне значение NULL, когда я пытаюсь зарегистрировать его, но если я пытаюсь распечатать имя объекта, это не выдает мне ошибок.Извините за плохо отформатированный код, и мы будем благодарны за любую помощь, пожалуйста, дайте мне знать, если я могу что-то добавить, если вопрос неясен или расплывчат.Спасибо!

Это класс сотрудника

public class Employee {

   protected String name;
   protected Employee parent;

   public Employee() {
    this.parent = null;
    this.name = "name not set";
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
    this.name = name;
   }

   public Employee getParent() {
       return parent;
   }

   public void setParent(Employee parent) {
       this.parent = parent;
      }
   }

Это класс разработчика

   public class Developer extends Employee {
   protected ArrayList<Employee> staffList;

   public Developer() {
       super();
       this.staffList = new ArrayList<Employee>();
   }

    public void add(Employee e) throws Exception {
       System.out.println(e.getParent()); //prints null even though the parameter has parent
       if (e.getParent() instanceof Developer) {
           throw new Exception("You cannot add staff when your lead is a dev");
       } else if (e instanceof Manager) {
           throw new Exception("You cannot add manager as your staff bcs u r a dev");
       }

       e.setParent(this);
       this.staffList.add(e);
   }

   public void printData() {
       for(Employee e : staffList) {
           System.out.println(e.name);
       }
   }

}

Это класс менеджера

public class Manager extends Employee {
protected ArrayList<Employee> staffList;

public Manager() {
    // TODO Auto-generated constructor stub
    super();
    this.staffList = new ArrayList<Employee>();
}    

 public void add(Employee e) {
     e.setParent(this);
     this.staffList.add(e);
 }

 public void printData() {
        for(Employee e : staffList) {
            System.out.println(e.name);
        }
     }
 }

На главной.java

public static void main(String[] args) {
    Manager man1 = new Manager();
    man1.setName("man1");

    Developer dev1 = new Developer();
    dev1.setName("dev1");
    man1.add(dev1);

    Developer dev2 = new Developer();
    dev2.setName("dev2");
    man1.add(dev2);

    Developer dev3 = new Developer();
    dev3.setName("dev3");
    dev2.add(dev3);

    System.out.println(dev3.getParent()); //composite.Developer@2a139a55

    Developer dev4 = new Developer();
    dev4.setName("dev4");
    dev3.add(dev4);
 }

1 Ответ

0 голосов
/ 19 октября 2018

Чего не хватает, так это код вызова.Ваш оператор печати в Developer.add () при печати null указывает, что вы не установили родительский элементПроверьте код вызова, чтобы убедиться, что вы действительно установили родителя.

Несколько других вопросов, которые следует учитывать.Логика в методе Developer.add (), кажется, немного не в порядке.Вы создаете исключение, если родитель добавляемого вами сотрудника - разработчик.Это указывало бы на логику того, что вы пытаетесь передать сотрудника этому разработчику.Это твое намерение?

Я предполагаю, что ты хотел сказать, что у разработчика не может быть сотрудников, потому что его начальник - разработчик, тогда если утверждение должно быть:

if (this.parent !== null && this.parent instanceof Developer) throw...

Например, если вызывающий код имеет вид:

dev.setParent(new Developer());
dev.add(new Employee()); <-- throw exception "You can't have staff 'cause your boss is a dev, and not a manager."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...