Java继承:不同对象的相同方法
假设我有以下简单的构造:Java继承:不同对象的相同方法,java,inheritance,Java,Inheritance,假设我有以下简单的构造: public abstract class Geometry { ... } public class TriangleGeo extends Geometry { Triangle triangle; } public class RectangleGeo extends Geometry { Rectangle rectangle; } public class Rectangle { private size; } public c
public abstract class Geometry {
...
}
public class TriangleGeo extends Geometry {
Triangle triangle;
}
public class RectangleGeo extends Geometry {
Rectangle rectangle;
}
public class Rectangle {
private size;
}
public class Triangle {
private size;
}
我现在有两种方法:
public void calcSizeOfRect(Rectangle rect){
System.out.println(rect.size);
}
public void calcSizeOfTria(Triangle tria){
System.out.println(tria.size);
}
我真正想要的是两个对象都有一个calcSize方法。因为实际上,这些方法是1:1,并且只涉及公共属性
我认为解决这个问题的唯一可能方法是将颜色变量移动到Geometry类中。你知道另一种方法吗?因为重构需要做很多工作
如果有必要,请使用Java 9。您只需添加以下方法即可
public void calcSize(Geometry geometry) {
// Implementation code
}
由于三角形
和矩形
都继承自几何体
,因此可以创建一个接受几何体
实例的方法
如果方法calcSize
将成为Geometry
类的一部分,您甚至可以只执行以下操作
public void calcSize() {
// Implementation Code
}
你将能够做到这一点,因为理论上你应该已经有了计算尺寸的细节。然而,这一切都取决于实现中的其他事实
另一个选项是实现一个
接口
,请参见,更好的方法是为每种类型声明一个接口
接口基本形状{
公共区域();
公共颜色getColor();
}
类实现基本形状{
双区;
颜色;
三角形(整数基、整数高、颜色){
面积=.5*基础*高度;
这个颜色=颜色;
}
公共颜色getColor(){
返回颜色;
}
公共区域(){
返回区;
}
}
然后,为每种类型实现适当的代码。简单地说,在
抽象类几何体中放置一个名为calcSize()
的抽象方法,然后根据您的要求在其子类中重写它
public class SolutionGeometry {
public static void calcSiz(Geometry geo){
System.out.println(geo.size);
}
public static void main(String[] args) {
Triangle a = new Triangle();
a.size = 6;
calcSiz(a);
Rectangle b = new Rectangle();
b.size = 6;
calcSiz(b);
}
}
abstract class Geometry {
int size;
private int color;
}
class Triangle extends Geometry {
}
class Rectangle extends Geometry {
}
或
创建一个名为2DShapes
的界面(因为它更有意义,也可以使用名称区域
,而不是大小
,更有意义)并在其中包含方法calcSize()
。然后在上述方法中为您喜欢的任何类实现该接口。
您需要(准确地说,动态多态性)我确实喜欢界面的想法,但是您所拥有的将不起作用,并且会抛出错误。您不能有public int-area(){}
,除非使用默认关键字,如default int-area(){//Implementation code}
,否则将出现错误,因为接口不能有带有该
default`关键字的实现代码。还有它的接口
不是接口
。我已经-1,但是如果你更正了你的代码,我将删除。我在你发布之前更正了它。这就是即时写作的问题。按照承诺删除,不想听起来很小气;很抱歉,如果我这么做了,因为这是一件小事。类Rectangle
和Rectangle
和Triangle
和Triangle
是否位于同一个包中?如果没有,那么您将有一个编译时错误?为什么有2个矩形
和三角形
类?请澄清,但请稍候,我无法通过这种方式访问对象的大小参数。“大小”属性不是父几何图形类的一部分。这就是我问题的核心:/@CoffeeCups您所需要做的就是将其作为几何
类的一部分。如果从几何体
继承的所有类都应该具有大小
属性,那么它实际上应该在几何体
类中。我甚至认为几何体
构造函数应该接受大小
作为参数。然后在Geometry
的任何子类中,您应该强制该类在其构造函数中提供size
参数,该参数将传递到超类中。什么?为什么他们将calcSize
方法置于Geometry
类之外?