Java OOP问题:如何统一调用两个不同父类的子类对象方法
解决方案:利用接口实现多态统一调用
这是Java多态与接口设计的典型应用场景,刚好能解决你遇到的「无需判断类型即可统一调用方法」的问题——因为你的myMovie和myImage已经分别继承了Movie和PImage(Java是单继承语言,无法再继承自定义抽象类),接口就是最适合的方案。我给你一步步拆解实现:
1. 定义统一行为的接口
首先创建一个接口,用来约定所有需要被统一绘制的对象必须实现的方法,比如我们叫它Drawable:
public interface Drawable { // 声明统一的绘制方法,所有实现类必须提供具体逻辑 void draw(); }
2. 让自定义类实现接口
修改你的myMovie和myImage,让它们实现Drawable接口,并把各自的绘制逻辑写入draw()方法中:
改造myMovie类
class myMovie extends Movie implements Drawable { // 你的现有属性、构造方法、其他方法都保持不变 int posi_x; int posi_y; myMovie(PApplet parent, String filename, int pposi_x, int pposi_y, float pangle, String player) { super(parent, filename); // 初始化逻辑... this.posi_x = pposi_x; this.posi_y = pposi_y; } int getFadeVal() { /* 原有实现 */ } void fadeOut(int pms) { /* 原有实现 */ } void fadeIn(int pms) { /* 原有实现 */ } void exit() { /* 原有实现 */ } // 实现Drawable接口的draw方法,编写myMovie的绘制逻辑 @Override public void draw() { // 这里写你的电影绘制逻辑,比如调用父类的draw并传入位置参数 super.draw(posi_x, posi_y); // 可以添加你自己的额外绘制逻辑,比如透明度处理等 } }
改造myImage类
class myImage extends PImage implements Drawable { // 你的现有属性、构造方法等保持不变 int posi_x; int posi_y; PApplet parent; // 假设你需要引用PApplet来绘制 // 示例构造方法 myImage(PApplet parent, String filename, int pposi_x, int pposi_y) { super(filename); this.parent = parent; this.posi_x = pposi_x; this.posi_y = pposi_y; } // 实现Drawable接口的draw方法,编写myImage的绘制逻辑 @Override public void draw() { // 用PApplet的image方法绘制当前图片 parent.image(this, posi_x, posi_y); // 同样可以添加自定义逻辑 } }
3. 主循环统一调用
现在你可以用Drawable类型的数组/集合来存储所有需要绘制的对象,遍历的时候直接调用draw()方法即可——Java的多态特性会自动帮你调用对应对象的具体实现,完全不需要判断类型或强制转换:
// 声明Drawable数组存储所有动画对象 Drawable[] ani_list = new Drawable[2]; // 添加具体对象 ani_list[0] = new myMovie(parent, "movie.mp4", 100, 100, 0, "default"); ani_list[1] = new myImage(parent, "pic.png", 200, 200); // 主循环中统一绘制 for (Drawable ani : ani_list) { ani.draw(); }
为什么这个方案可行?
- 接口定义了统一的行为契约,所有实现它的类都必须遵守这个契约(实现
draw()方法); - Java的多态特性会在运行时自动识别对象的实际类型,并调用对应的
draw()实现; - 扩展性极强:如果以后新增其他需要统一绘制的类(比如
mySprite),只需要让它也实现Drawable接口,就能直接加入到数组中,无需修改主循环代码。
内容的提问来源于stack exchange,提问作者rele92
相关产品推荐
相关产品推荐

