(Has-A vs. Is-A) 如何布局我的程序架构? (JAVA)

(Has-A vs. Is-A) How to layout my program architecture? (JAVA)

我有三个组成部分:

我知道:

  1. MainCategory IS-A Category
  2. MainCategory Has-A SubCategory
  3. SubCategory IS-A Category

但是,当我尝试使用 extendsimplements 在我的代码中构造它们时,我有点困惑。这是我到目前为止所做的,请告诉我这是否有意义,或者是否应该以其他方式完成?谢谢。

public interface Category{}

public class MainCategory implements Category{}

public class SubCategory extends MainCategory implements Category {}

我想知道我的思考方式是否正确。此外,每个 MainCategory 将包含多个 subCategory,因此使用 extends 是否正确,或者这是否意味着聚合?谢谢。

MainCategory Has-A SubCategory 表示在 MainCategory 中定义了一个 SubCategory 对象,如下所示。这实际上不是通过扩展来实现的。

public class MainCategory implements Category{
      public SubCategory subcat = new SubCategory();
}

public class SubCategory implements Category{
}

SubCategory IS-A Category 已经完成步骤 MainCategory IS-A Category,因为 SubCategory 是 MainCategory

的子 class

根据您提到的内容:

  1. 主要类别IS-A类别
  2. 主要类别Has-A子类别
  3. 子类别IS-A类别

SubCategory 应该 而不是 继承自 MainCategory。它应该简单地实现 Category 接口。如果你在 SubCategoryMainCategory 之间有很多共同的代码,正如我怀疑的那样,那么我可以建议一个替代布局:

class Category {
    private List<SubCategory> children = new ArrayList<SubCategory>();

    public List<SubCategory> getSubCategories() {
        return children;
    }

    public void addSubCategory(SubCategory child) {
        child.setParent(this);
        children.add(child);
    }

    public Category getParent() {
        return null;
    }
}

class SubCategory extends Category {
    private Category parent = null;

    public Category getParent() {
        return parent;
    }

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

任何 Category 可能有 SubCategory 但只有 SubCategory 可以有 parent。请注意 Category 而不是 抽象 class。我的想法是Category可以直接实例化。这将是您 SubCategory class 中大多数逻辑的根类别和基础。 SubCategory 可以覆盖 SubCategory 特有的任何行为。如果你发现你不得不在 SubCategory 中重载很多行为,那么让 Category 成为一个抽象的 class 并创建一个 MainCategory 来代替,但我怀疑它赢了'是你的情况。

希望对您有所帮助!

获得这些:

MainCategory IS-A Category
MainCategory Has-A SubCategory
SubCategory IS-A Category

你想要这些:

// MC is a category and has a SC
public class MainCategory implements Category{
    // One or more SCs
    SubCategory sc1, sc2;
    ArrayList<SubCategory> scList;
    SubCategory [] scArray;
}

// SC is a category
public class SubCategory implements Category {}

如果满足以下条件,您只能将 SubCategory 扩展到 MainCategory

SubCategory IS-A MainCategory