Создание объекта внутри другого объекта в Java (композиция против наследования) - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь понять, как работает композиция в Java, и я застреваю. У меня есть программа, которая создает экземпляр объекта Customer, который имеет объект Computer в качестве переменной экземпляра. В моей программе есть два типа объектов Computer, подкласс Desktop и Laptop, поэтому у меня есть класс Desktop, расширяющий класс Computer, и класс Laptop, который также расширяет класс Computer. У меня есть класс Computer в качестве абстрактного класса, но я знаю, что вы не можете создать экземпляр абстрактного объекта. Я не уверен, как создать экземпляр объекта Computer в моем классе Customer. Любое понимание приветствуется! Пример кода:

public class Customer
{
   private String name;
   private Computer computer;

   public Customer(String n)
   {
      setName(n);
      this.computer = new Computer(); //Can't do this b/c Computer is abstract
   }

   //Setters and getters for name
   public Computer getComputer()
   {
      return new Computer(this.computer);
   }

   public void setComputer(Computer computer)
   {
      this.computer = new Computer(computer);
   }

}
public abstract class Computer{
}

public class Desktop extends Computer{
}

public class Laptop extends Computer{

}

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Способ решения этой проблемы заключается в том, что ваш конструктор также должен принимать аргумент компьютера

   public Customer(String n, Computer c)
   {
      setName(n);
      this.computer = c;
   }

Но есть много причин, чтобы предпочесть POJO (Plain Old Java Objects) только с нулевым конструктор над классами, которые требуют элементы композиции в типе конструкции. Для получения дополнительной информации см .: В чем преимущество POJO?

0 голосов
/ 04 мая 2020

Да, вы правы. Вы не можете создать экземпляр абстрактного класса Computer (). Вместо этого вы можете сделать

this.computer = new Laptop() 
this.computer = new Desktop()

в зависимости от того, что у них есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...