由于我正在努力了解有关OOP(Java)的更多信息,因此我正在通过一些文献中找到这个“任务”。不幸的是,由于我对OOP很新,我没有任何样本解决方案。也许你们中的一些人可以给我一些意见,所以可以通过这个方式。
01班级等级
好的,这是简单的数学运算,您可以在各地找到关于四边形层次结构的大量信息。这是我做的:
创建每个类的对象没什么大不了的,但是我对理解所有OOP技术仍有一些问题。有些地方我不知道最好的方法是什么...(例如,继承自两个类的广场,在java中根本不可能)。此外,公式(如计算表面积)无论如何都会被覆盖(因为它们在大多数情况下是不同的),所以为什么我还需要继承呢?我不能只使用一个接口,在所有这些类中使用它,迫使他们实现这些公式吗?
问候 - Vulpecula
答案 0 :(得分:2)
在现实生活中,使用界面可能会更好。像这样的深层继承结构常常令人不悦;通常认为“更喜欢构图而不是继承”(http://en.wikipedia.org/wiki/Composition_over_inheritance)。例如,您可以使用“四边形”界面来定义“表面区域”和“周长”,然后让其他形状满足该界面。
如果这是一个家庭作业问题,那么您应该将课程层次结构基于您的教科书/教师之前提供的任何示例。这不是关于设计健壮的软件,而是关于向老师证明你学会了以他们认为应该做的任何方式做事。
答案 1 :(得分:1)
作为中等复杂层次结构基础的抽象类不如界面灵活。类 - 抽象与否 - 强制特定类型的实现。
不用太考虑,这是开始的一种方式:
public interface Quadrilateral {
int getTopMillimeters();
int getLeftMillimeters();
int getRightMillimeters();
int getBottomMillimeters();
}
从这些原始数据中,您还可以定义
getTopLeftAngle(),getTopRightAngle(),...
将根据长度计算其值。
我也会强调构图而不是继承。最终结果确实可以是一个复杂的继承结构。
对我来说,组合是“Composer”类的层次结构,它们不实现接口。如
public class QuadrilateralComposer {
private final int iTopMM;
private final int iBtmMM;
...
public QuadrilateralComposer(int i_topMM, int i_bottomMM, ...) {
if(i_topMM < 1) {
throw new IllegalArgumentException...
}
if(i_bottomMM < 1) {
throw new IllegalArgumentException...
}
...
iTopMM = i_topMM;
iBtmMM = i_bottomMM;
...
}
public int getTopMillimeters() {
return iTopMM;
}
...
然后由抽象类组成:
public class AbstractQuadrilateral implements Quadrilateral
private final QuadrilateralComposer qc;
public AbstractQuadrilateral(int i_topLen, int i_bottomLen, ...) {
gc = new QuadrilateralComposer(i_topLen, i_bottomLen, ...);
}
public int getTopLength() {
return gc.getTopLength();
}
...
抽象类从不扩展其他抽象类,它们只使用内部Composers(并实际实现接口)。另一方面,Composers只扩展Composers,并在内部使用其他作曲家。
(三个注释:受保护的函数在作为public function_4prot()
的Composer中实现,并实现为protected function()
,它调用_4prot
版本。有时抽象类确实可以实现在这种情况下,它将是具体的[非抽象]并被命名为“SimpleXYZ”,而不是“AbstractXYZ”。最后,静态实用函数驻留在Composer中。)
如果每个接口都是以这种方式设计的,那么任何类都可以轻松实现任何接口,无论它们必须实际扩展哪个类。如果抽象类扩展了其他抽象类,那么对于需要实现接口的类来说,这是更多的工作,但恰好 - 并且必须 - 扩展其他类。
这不是你问的问题,但是学习这个概念会更好地改变我的代码。在接受的答案中看到它,让我思考所有这些。在过去的几年里,我实际上已经慢慢地从继承转向构图,在阅读了Effective Java之后,它仍然是继承棺材中的最后一块钉子。
答案 2 :(得分:0)
好的,现在的计划是我试图在没有任何接口的情况下解决这个问题。所以这是继承地图:
我忽略了这样一个事实:广场不仅是一个矩形而且还是一个菱形。
抽象类(四边形)将定义(但不实现)计算“表面积”和“周长”的方法。覆盖方法很容易,因为每个形状都有不同的计算形式,但我不确定在哪里可以使用重载功能。
还有一件事:使用界面,这会是理想的方式吗?