Вы наследуете объект суперкласса в базовом классе, когда наследуете его? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть этот класс, который в основном представляет точку в плоскости XY и имеет эту функцию для вычисления расстояния между двумя точечными объектами:

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*/);

}

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Попробуйте это.

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));
    }
}
1 голос
/ 19 июня 2020

Я думаю, вы, возможно, захотите немного пересмотреть свои знания о OOP, если честно.

На мой взгляд, наследование в OOP определяет то, что называется «есть» отношения между подклассом и суперклассом. Например, если у вас есть класс Shape и класс Square или Circle, мы можем определить отношения «есть-а» между этими классами, потому что «круг» - это «форма, квадрат» - это «форма». Любые методы, которые работают с Shape, могут работать с квадратами и кругами, потому что обычно вещи, которые применяются к Shape, также применимы к Squares и Circles.

Моя проблема с вашим примером заключается в том, что для меня 3DPoint не действительно то же самое, что и 2DPoint. На мой взгляд, никогда не будет легко преобразовать / преобразовать 3DPoint в 2DPoint. Я имею в виду, вы можете попробовать сделать это, просто игнорируя одну из координат (например, z), но для меня это все равно немного странно. Если бы я проектировал это, я бы не делал 3DPoint extends 2DPoint. Я мог бы сделать так, чтобы оба класса расширяли что-то вроде класса Vector, но я бы не стал заставлять 3DPoint расширять 2DPoint. Однако один совершенно правильный метод, который вы могли бы создать в 3DPoint, будет:

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

Это может быть полезно для вас.

Итак, наконец, совет: если дизайн не предусматривает смысл, то есть вы можете ясно видеть связь «is-a» между двумя классами, тогда я бы сказал, что не используйте расширение / наследование, строки кода, которые вы сохраните, не будут платить за неправильный дизайн в долгосрочной перспективе, особенно по мере того, как ваша кодовая база становится больше.

Надеюсь, это хоть как-то поможет.

...