Добавить объект Part в observableArrayList <Part>associatedParts в классе Product в Java - PullRequest
2 голосов
/ 06 мая 2020

Я работаю над назначением своего класса, и я застрял.

У меня два класса: Part, который является абстрактным и имеет классы InHouse и Outsourced, расширяющие Part. Затем у меня есть Product, у которого, как ни странно, есть observableArrayList частей, называемых connectedParts.

Я работаю над своим AddProductController, пытаясь вызвать метод в Product class addAssociatedPart(). Моя проблема в том, что компилятор не находит метод в Part. Если я использую InHouse, он не находит метод в InHouse и так далее. Я не могу использовать метод stati c, потому что метод addAssociatedPart() должен быть нестандартным c в соответствии с дизайном UML. Итак, я не могу явно указать, чтобы найти его в Product.addAssociatedPart(), потому что он говорит мне, что я не могу ссылаться на нестатический c et c.

Вот фрагменты кода, начинающиеся с класс продукта.

public class Product {
private ObservableList<Part> associatedParts = FXCollections.observableArrayList();
private int id;
private String name;
private double price;
private int stock;
private int min;
private int max;

public void addAssociatedPart(Part part) {

   getAllAssociatedParts().add(part);
}

public ObservableList<Part> getAllAssociatedParts() {
    return this.associatedParts;
}

И затем класс AddProductScreenController:

public class AddProductScreenController implements Initializable {

@FXML
public void onAddProductAddPart(ActionEvent event) {

    // this is triggered when the Add button is clicked

    Part selectedItem = addProductTableViewAll.getSelectionModel().getSelectedItem();
    selectedItem.addAssociatedPart(); // can't find method
    Product.selectedItem.addAssociatedPart(); // can't find variable selectedItem (obviously bad formatting)
    selectedItem.Product.addAssociatedPart(); // can't find variable Product (again bad formatting)
    addAssociatedPart(selectedItem); // can't find method addAssociatedPart()
    Product.addAssociatedPart(selectedItem); // non-static method, can't be referenced from a static context

    InHouse newPart = new InHouse(1, "test", 1.99, 1, 1, 1, 101);
    addAssociatedPart(newPart); // can't find method
    Product.addAssociatedPart(newPart); // non-static method
    newPart.addAssociatedPart(); // can't find method


    addProductTableViewPartial.setItems(associatedParts);
}
}

Запрошенный код детали:

public abstract class Part {
private int id;
private String name;
private double price;
private int stock;
private int min;
private int max;


public ObservableList<Part> allParts = FXCollections.observableArrayList();

public Part(int id, String name, double price, int stock, int min, int max) {
    this.id = id;
    this.name = name;
    this.price = price;
    this.stock = stock;
    this.min = min;
    this.max = max;
}

public void setId(int id) {
    this.id = id;
}
public int getId() {
    return this.id;
}

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

public void setPrice(double price) {
    this.price = price;
}
public double getPrice() {
    return this.price;
}

public void setStock(int stock) {
    this.stock = stock;
}
public int getStock() {
    return this.stock;
}

public void setMin(int min) {
    this.min = min;
}
public int getMin() {
    return this.min;
}

public void setMax(int max) {
    this.max = max;
}
public int getMax() {
    return this.max;
}

}

Это InHouse

 package model;



public class InHouse extends Part {
    private int machineId;

    public InHouse(int id, String name, double price, int stock, int min, int max, int machineId) {
        super(id, name, price, stock, min, max);
        this.machineId = machineId;
    }



    public void setMachineId(int machineId) {
        this.machineId = machineId;
    }
    public int getMachineId() {
        return this.machineId;
    }

}

И затем Аутсорсинг:

    package model;


public class Outsourced extends Part {

    private String companyName;

    public Outsourced(int id, String name, double price, int stock, int min, int max, String companyName) {

        super(id, name, price, stock, min, max);
        this.companyName = companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public String getCompanyName() {
        return this.companyName;
    }
}

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

Обновление

@ Le и @Jackson указали мне правильное направление своими комментариями ответ, который он предоставил. Сначала мне нужен товар:

Product product = new Product(1, "test", 1.99, 1, 1, 1);
product.addAssociatedPart(selectedItem);

Ответы [ 3 ]

1 голос
/ 06 мая 2020

enter image description here

Я пытался объяснить вам ассоциацию ваших различных классов в комментариях, но подумал, что воспользуюсь визуальной помощью. Я упростил ваш сценарий до задачи classi c OOP.

public class Product {

    public void addAssociatedPart(Part part) {
        // some stuff
    }
}
public abstract class Part {
}
public class InHouse extends Part {
}
public class Outsourced extends Part {
}
public class Assembly {

    public static void main(String[] args) {
        Product car = new Product();

        Part seat = new InHouse();
        Part engine = new Outsourced();
        Part window = new InHouse();

        car.addAssociatedPart(seat);
        car.addAssociatedPart(engine);
        car.addAssociatedPart(window);
    }
}

У меня нет метода в моем Part или его подклассы, чтобы добавить себя к некоторым Product. Вы пытались достичь этого?

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

Вы запутались с методом stati c и non stati c. Для доступа к AddAssociatedPart () вам нужен экземпляр продукта. Визуализируйте свой класс на диаграмме классов.

enter image description here

public void onAddProductAddPart(ActionEvent event) {

// this is triggered when the Add button is clicked

Part selectedItem = addProductTableViewAll.getSelectionModel().getSelectedItem();
selectedItem.addAssociatedPart(); // addAssociatedPart() is method of Product, not Part
Product.selectedItem.addAssociatedPart(); // Product class has no static member selectedItem   
selectedItem.Product.addAssociatedPart(); // syntax error
addAssociatedPart(selectedItem); // addAssociatedPart() is not method of AddProcutController
Product.addAssociatedPart(selectedItem); // if you reference the method start with a class, the method is expected to be a static method. addAssociatedPart() is not a static method, call it with a product instance

InHouse newPart = new InHouse(1, "test", 1.99, 1, 1, 1, 101);
addAssociatedPart(newPart); // addAssociatedPart() is not part of AddProductController
Product.addAssociatedPart(newPart); // dont reference non-static method with a class name
newPart.addAssociatedPart(); // addAssociatedPart() is not part of Part


addProductTableViewPartial.setItems(associatedParts);
}
0 голосов
/ 06 мая 2020

Я работаю над своим AddProductController, пытаясь вызвать метод в классе Product addAssociatedPart ().

Моя проблема в том, что компилятор не находит метод в Части.

Почему он должен? Часть является потомком продукта? В противном случае вы вызываете метод продукта с использованием экземпляра Part.

Чтобы использовать методы Inhouse и Oursourced для частей, вы можете сделать что-то вроде этого

if (selectedItem instanceof InHouse){
    Inhouse inhouse = (Inhouse)selectedItem;
    //do what you need with inhouse methods
}else{
   Outsourced outsourced = (Outsourced)selectedItem;
   //do what you need with oursourced method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...