我有一个名为"Canvas"的超类,我从中创建了几个子类.我想将这些子类的实例存储在字典中.所以我尝试设置我的代码如下:
public class Main {
public static void main(String[] args) throws Exception{
Canvas canvas = new Canvas();
Menu menu = new Menu();
Instructions instructions = new Instructions();
Map<String, Canvas> screens = new HashMap<String, Canvas>();
screens.put("menu", menu);
screens.put("instructions", instructions);
Run Code Online (Sandbox Code Playgroud)
因此,我想要添加到字典中的东西都是我的Canvas类的子类,我设置哈希表来接受该类型.这在大多数情况下都有效.但是,最大的问题是我无法访问任何子类的方法.我只能调用超类中存在的方法.
如果我尝试做类似的事情,
screens.get("menu").some_func_in_subclass();
Run Code Online (Sandbox Code Playgroud)
编译器吐出"无法找到符号"消息.
所以,如果我有这样的事情:
SuperClass
|
|
+------------------------------------
| | |
SubClass1 SubClass2 SubClass3
Run Code Online (Sandbox Code Playgroud)
如何将这些子类的实例存储在HashMap中?
这就是多态的想法 - 所有子类Canvas
共享相同的方法(来自Canvas
超类),但如果你向这些类添加方法,它们就不再共享了.
一种方法是投射你的结果(假设你已经检查过这个值真的是一个Menu
):
((Menu)screens.get("menu")).some_func_in_subclass();
Run Code Online (Sandbox Code Playgroud)
但它首先打破了把所有东西都放在一边的目的Map<String, Canvas>
.
最后,要么你需要Canvas
对象,你不应该调用子类方法,或者你需要更具体的东西,可能存在设计问题.
归档时间: |
|
查看次数: |
974 次 |
最近记录: |