【问题标题】:Do you inherit an object of super class in base class when you inherit it?继承时是否继承了基类中的超类对象?
【发布时间】:2020-10-09 07:18:57
【问题描述】:

我有这个类,它基本上代表 X-Y 平面上的一个点,并且有这个函数来计算两个点对象之间的距离:

double dist(2DPoint p){
return Math.sqrt(Math.pow(x-p.x, 2) + Math.pow(y-p.y, 2));
}

我现在想在 3DPoint 类中创建一个表示空间点的类。我想继承 2d Point 并创建一个计算两个 3d 点之间距离的函数。

我想这样做,这样我就可以像这样使用以前的功能:

double dist(3DPoint p)
{
    return Math.sqrt(Math.pow(z - p.z, 2) + /*Square of dist between X,Y s of the two 3d pts using the dist function from 2DPoint*/);

}

【问题讨论】:

  • 你可以调用 super.dist()

标签: java inheritance scope cartesian


【解决方案1】:

试试这个。

class Point2D {
    double x, y;
    double dist(Point2D p) {
        return Math.hypot(x - p.x, y - p.y);
    }
}

class Point3D extends Point2D {
    double z;
    double dist(Point3D p) {
        return Math.hypot(z - p.z, super.dist(p));
    }
}

【讨论】:

  • 会不会出现数据类型兼容性错误,因为我们将 Point3D 对象传递给形式参数为 Point2D 对象的函数?
  • 我使用了你的程序,它可以工作,但你能解释一下它背后的逻辑吗?
【解决方案2】:

老实说,我认为您可能想重新审视一下您对 OOP 的了解。

在我看来,OOP 中的继承定义了子类和超类之间所谓的“is-a”关系。例如,如果您有一个类 Shape 和一个类 Square 或 Circle,我们可以在这些类之间定义“is-a”关系,因为 Circle “is-a” Shape,Square “is-a” Shape。任何对 Shape 进行操作的方法都可以对正方形和圆形进行操作,因为通常适用于 Shape 的东西也适用于 Squares 和 Circles。

我对您的示例的问题是,对我来说,3DPoint 与 2DPoint 并不完全相同。在我看来,将 3DPoint 转换/投射到 2DPoint 绝不容易。我的意思是,您可以尝试通过简单地忽略其中一个坐标(例如 z)来做到这一点,但这对我来说仍然有点奇怪。如果我正在设计这个,我不会让 3DPoint 扩展 2DPoint。我可能让两个类都扩展类似于 Vector 类的东西,但我不会让 3DPoint 扩展 2DPoint。但是,您可以在 3DPoint 中创建的一种完全有效的方法是:

class 3DPoint {
...
    public 2DPoint to2D() {
        return new 2DPoint(x, y);
    }
}

这可能对你有用。

所以,最后,一条建议:除非设计有意义,也就是说,你可以清楚地看到两个类之间的“is-a”关系,那么我会说不要使用扩展/继承,从长远来看,您将节省的代码行不会为错误的设计付出代价,尤其是当您的代码库变得更大时。

希望这对您有所帮助。

【讨论】:

  • 我只问了这个问题,因为这是我们教科书的继承练习,所以我认为可以做到。我知道这有点愚蠢。我什至没有选择变量或函数名称。
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2014-01-01
相关资源
最近更新 更多