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
类之外?