Java桌面应用主题切换:Object变量调用draw()方法报错解决方案咨询
解决Java主题类调用draw()方法的类型报错问题
这问题的核心很明确:你把theme声明成了Object类型,但Object类本身并没有draw()方法,IDE自然会报错。咱们用面向接口编程就能完美解决,步骤如下:
1. 定义统一的主题接口
先创建一个Theme接口,把所有主题类共有的draw()方法定义在这里:
public interface Theme { // 所有主题必须实现这个绘制方法 void draw(); }
2. 让所有主题类实现该接口
修改你的Modern、Circles、Default类,让它们都实现Theme接口,并实现draw()方法。举个Modern类的例子:
public class Modern implements Theme { private String type; public Modern(String type) { this.type = type; } @Override public void draw() { // 这里写你的Modern主题绘制逻辑 System.out.println("Drawing modern " + type + " theme"); } }
Circles和Default类也照此处理,确保它们都实现了Theme接口的draw()方法。
3. 修改theme变量的类型
把原来的public Object theme;改成public Theme theme;,这样变量的类型就变成了我们定义的接口类型:
public Theme theme; // 赋值逻辑保持不变,因为所有主题类都实现了Theme接口 String theme_selector = prefs.get("theme", "default"); switch(theme_selector){ case "modern 2d": theme = new Modern("2d"); break; case "modern 3d": theme = new Modern("3d"); break; case "circles" : theme = new Circles(); break; default: theme = new Default(); break; }
现在你再调用theme.draw()的时候,IDE就不会报错了——因为Theme接口明确声明了draw()方法,编译器知道这个变量引用的对象一定有这个方法。
这种方式还有个额外好处:以后你要新增新的主题类,只要让它实现Theme接口就行,不用修改现有的赋值和调用逻辑,完全符合开闭原则。
内容的提问来源于stack exchange,提问作者Leonardo P.
相关产品推荐
相关产品推荐

