所以我有这个名为Card的类,在这个类中我有一个Image,然后我有几个其他的类继承这个类和那些类。
我已经决定创建一个现在扩展Image的新类,而不是在我的父Card类中使用它而不是Image类。但是,正因如此,它已经搞砸了传递Image变量的所有其他类。
我是否需要将旧Image类的所有实例更改为新的CardImage类,还是有另外一种方法吗?
示例:
<article class="post-wrapper info">
...
</article>
<article class="post-wrapper success">
...
</article>
<article class="post-wrapper warning">
...
</article>
答案 0 :(得分:1)
良好的软件设计可以避免在必须对代码进行级联更改时出现的麻烦和错误。如果你发现自己在想,“嗯,如果我做了一点改变,我将不得不改变对XYZ类的每一个引用”你可能做错了。
现在回答您的问题:对于继承,扩展Image
意味着CardImage
的每个实例都是Image
。因此,将CardImage
传递给类A
或B
的构造函数是完全有效的。
注意:当您扩展Image
类时,如果您覆盖其遵守方法合同的方法(例如hashCode
方法),则需要小心)。只要你尊重超级班的合同,你的扩展就不应该破坏你的代码。
另外,请确保扩展正确的课程:com.badlogic.gdx.scenes.scene2d.ui.Image
答案 1 :(得分:1)
如果您的所有课程仅使用CardImages
,则更改所有课程可能会有意义。但是,如果只有A
类将使用CardImage
,那么不要更改任何内容。只需将Image
投射到CardImage
A
并使用它即可。由于每个CardImages
也是Image
,编译器不会促使您更改参数类型。
public class A {
private Image image;
public A(Image image){
this.image = image;
}
public void methodWhichNeedsCardImage() {
if(image instanceof CardImage) {
CardImage cImage = (CardImage) image;
}
}
}