【问题标题】:need help casting classes需要帮助铸造类
【发布时间】:2014-06-09 19:37:38
【问题描述】:

这是我的情况(不是实际代码,只是一个粗略的大纲):

class Base {
    public static Image img;
}

class A extends Base {
    A() {
        img = "code to get certain image here";
    }
}

class B extends Base {
    B() {
        img = "code to get certain image2 here";
    }
}

我有一个 Base 数组,其中一些是 A 或 B。我想获取特定于该类的 img 实例。例如。如果它是 A 的一个实例,它将显示在 A 中定义的 img。但是我不能只使用 if 语句,因为我将加班添加许多不同的类,而且我希望获取图像的代码不需要更改为包含更多课程。

【问题讨论】:

  • Base 中创建一个display 方法并让AB 相应地覆盖它。除了您的情况,这通常可以工作,因为Image imgstatic。您知道这种设计的后果吗?
  • 只需在超类的构造函数中传入即可。类似super(img)
  • 就像@LuiggiMendoza 建议在您发布的代码中使用static 必须是拼写错误。如果不是,那么您应该停止思考/致力于整体设计,并确保您首先了解该语言的基本原理。
  • 你不能转换类(或对象),你只能转换引用。这是一个重要的区别。

标签: java class casting


【解决方案1】:

恐怕只要img 字段是静态的,这将是不可能的。

事实是,无论何时创建新实例,AB 类型都会覆盖 img 字段,原因是 img 是静态的。 使您的img 非静态:

class Base {
    public /*static*/ Image img;
}

一切都应该开箱即用:

Base a = new A();
Base b = new B();
a.img; // Contains the image A created
b.img; // Contains the image B created

【讨论】:

  • 我需要创建很多 A 和 B 的实例。所以每个类的 img 必须是静态的,有没有办法做到这一点?例如。 A 的每个实例共享同一个 img 实例,这与 B 共享的所有实例不同。
  • 删除static 将确保每个Base 实例都有一个图像实例。如果您希望 A 实例与 B 实例具有不同的图像,则应将 img 属性向下移动到具体类。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2016-02-04
相关资源
最近更新 更多