(Has-A vs. Is-A) 如何布局我的程序架构? (JAVA)
(Has-A vs. Is-A) How to layout my program architecture? (JAVA)
我有三个组成部分:
- 接口:
Category
- Parent Class:
MainCategory
- Child Class:
SubCategory
我知道:
MainCategory
IS-A Category
MainCategory
Has-A SubCategory
SubCategory
IS-A Category
但是,当我尝试使用 extends
和 implements
在我的代码中构造它们时,我有点困惑。这是我到目前为止所做的,请告诉我这是否有意义,或者是否应该以其他方式完成?谢谢。
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
根据您提到的内容:
- 主要类别IS-A类别
- 主要类别Has-A子类别
- 子类别IS-A类别
SubCategory
应该 而不是 继承自 MainCategory
。它应该简单地实现 Category
接口。如果你在 SubCategory
和 MainCategory
之间有很多共同的代码,正如我怀疑的那样,那么我可以建议一个替代布局:
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
我有三个组成部分:
- 接口:
Category
- Parent Class:
MainCategory
- Child Class:
SubCategory
我知道:
MainCategory
IS-ACategory
MainCategory
Has-ASubCategory
SubCategory
IS-ACategory
但是,当我尝试使用 extends
和 implements
在我的代码中构造它们时,我有点困惑。这是我到目前为止所做的,请告诉我这是否有意义,或者是否应该以其他方式完成?谢谢。
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
根据您提到的内容:
- 主要类别IS-A类别
- 主要类别Has-A子类别
- 子类别IS-A类别
SubCategory
应该 而不是 继承自 MainCategory
。它应该简单地实现 Category
接口。如果你在 SubCategory
和 MainCategory
之间有很多共同的代码,正如我怀疑的那样,那么我可以建议一个替代布局:
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