java - 如何从父类(super class)引用的子类获取数据?形状 -> 矩形

标签 java class

我有 RectangleCircle 类。它们都扩展了ShapeObject 类保存对 Shape 的引用。

现在我想访问 object.shape.vertices 如果 shape 是 矩形 或 对于 object.shape.radius

我不想在 Shape 类中保存半径/顶点等值,因为半径永远不会在 矩形 中使用。

最佳答案

您可以使用 instanceof 运算符检查对象是否属于某种类型,然后转换为该类型。

double value = 0.0;
if (shape instanceof Circle) {
    Circle circle = (Circle)shape; // Cast the shape to a Circle
    value = circle.radius;
} else {
    // If it's not a circle, then it's a rectangle
    Rectangle rectangle = (Rectangle)shape; // Cast the shape to a Rectangle
    value = (double)rectangle.vertices;
}

但是,instanceof 运算符的使用应受到限制。我建议您在 Shape 类中创建一个返回适当字段的方法。

class Shape {
    public double getValue() {
        return 0.0;
    }
}

class Circle {
    public double radius;
    @Override
    public double getValue() {
        return radius;
    }
}

class Rectangle {
    public int vertices;
    @Override
    public double getValue() {
        return (double)vertices;
    }
}

使用上面的示例,我们可以将第一个代码示例缩短为

double value = shape.getValue();

这种方法遵循多态性,并且最终更易于维护,因为忘记重写方法(如果使用抽象方法就不可能忘记)比添加新的 instanceof 更难检查代码中的其他位置。

如果您了解抽象类和方法,我建议您将 Shape 类及其方法抽象化。

关于java - 如何从父类(super class)引用的子类获取数据?形状 -> 矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31860268/

相关文章:

java - 通过 C++ 和 Java 之间的 TCP 套接字发送消息

java - java getBytes 与 getBytes(charset) 的奇怪行为

c++ - 调用虚拟方法的不同方式

Javascript setInterval 不适用于此。对象

javascript - 使用javascript动态控制多个潜水风格的风格,使用类

java - 计算结果为0.0?

java - tomcat中奇怪的IP地址

c++ - cout一个类的函数

C# 枚举、结构和类

java - Files.lines 是否将所有行读入内存?