继承时是否继承了baseclass中superclass的对象?
Do you inherit an object of super class in base class when you inherit it?
我有这个 class,它基本上表示 X-Y 平面中的一个点,并具有计算两个点对象之间距离的函数:
double dist(2DPoint p){
return Math.sqrt(Math.pow(x-p.x, 2) + Math.pow(y-p.y, 2));
}
我现在想在 class 3DPoint 中创建一个 class 代表 space 中的一个点。我想继承 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*/);
}
老实说,我想您可能想重新了解一下您对 OOP 的了解。
在我看来,OOP 中的继承定义了 sub class 和 super class 之间所谓的 "is-a" 关系。例如,如果您有一个 class 形状和一个 class 方形或圆形,我们可以在这些 class 之间定义一个 "is-a" 关系,因为圆形 "is-a"形状,正方形 "is-a" 形状。任何对 Shape 进行操作的方法都可以对正方形和圆形进行操作,因为通常适用于 Shape 的内容也适用于正方形和圆形。
我对你的例子的问题是,对我来说,3DPoint 与 2DPoint 并不完全相同。在我看来,convert/cast 从 3DPoint 到 2DPoint 绝非易事。我的意思是,您可以尝试通过简单地忽略其中一个坐标(例如 z)来做到这一点,但这对我来说仍然有点奇怪。如果我正在设计这个,我不会让 3DPoint 扩展 2DPoint。我可能让两个 classes 都扩展了 Vector class 之类的东西,但我不会让 3DPoint 扩展 2DPoint。但是,您可以在 3DPoint 中创建的一种完全有效的方法是:
class 3DPoint {
...
public 2DPoint to2D() {
return new 2DPoint(x, y);
}
}
这可能对你有用。
所以,最后,一个建议:除非设计有意义,也就是说,你可以清楚地看到两个 class 之间的 "is-a" 关系,否则我会说不要如果不使用 extension/inheritance,您将节省的代码行将不会为长期 运行 中的错误设计付出代价,尤其是当您的代码库变得更大时。
希望这对您有所帮助。
试试这个。
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));
}
}
我有这个 class,它基本上表示 X-Y 平面中的一个点,并具有计算两个点对象之间距离的函数:
double dist(2DPoint p){
return Math.sqrt(Math.pow(x-p.x, 2) + Math.pow(y-p.y, 2));
}
我现在想在 class 3DPoint 中创建一个 class 代表 space 中的一个点。我想继承 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*/);
}
老实说,我想您可能想重新了解一下您对 OOP 的了解。
在我看来,OOP 中的继承定义了 sub class 和 super class 之间所谓的 "is-a" 关系。例如,如果您有一个 class 形状和一个 class 方形或圆形,我们可以在这些 class 之间定义一个 "is-a" 关系,因为圆形 "is-a"形状,正方形 "is-a" 形状。任何对 Shape 进行操作的方法都可以对正方形和圆形进行操作,因为通常适用于 Shape 的内容也适用于正方形和圆形。
我对你的例子的问题是,对我来说,3DPoint 与 2DPoint 并不完全相同。在我看来,convert/cast 从 3DPoint 到 2DPoint 绝非易事。我的意思是,您可以尝试通过简单地忽略其中一个坐标(例如 z)来做到这一点,但这对我来说仍然有点奇怪。如果我正在设计这个,我不会让 3DPoint 扩展 2DPoint。我可能让两个 classes 都扩展了 Vector class 之类的东西,但我不会让 3DPoint 扩展 2DPoint。但是,您可以在 3DPoint 中创建的一种完全有效的方法是:
class 3DPoint {
...
public 2DPoint to2D() {
return new 2DPoint(x, y);
}
}
这可能对你有用。
所以,最后,一个建议:除非设计有意义,也就是说,你可以清楚地看到两个 class 之间的 "is-a" 关系,否则我会说不要如果不使用 extension/inheritance,您将节省的代码行将不会为长期 运行 中的错误设计付出代价,尤其是当您的代码库变得更大时。
希望这对您有所帮助。
试试这个。
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));
}
}