2015-06-18 19 views
3

在以下情況下,Main.registerEvents(Listener)是遊戲API的事件系統的一部分。 假設它應該註冊任何方法與@EventHandler註釋。爲什麼「this」關鍵字也指向子類?

public abstract class Spell implements Listener { 
    protected Spell() { 
     Main.getInstance().registerEvents(this); 
    } 
    @EventHandler 
    public void onMove(PlayerMoveEvent event) { 

    } 
} 

public class Fireball extends Spell { 
    @EventHandler 
    public void onChat(PlayerChatEvent event) { 

    } 
} 

一般來說,因爲this指當前情況下,怎麼可能是Fireball.onChat(PlayerChatEvent)註冊嗎?

回答

5

一般來說,既然這是指當前實例,那麼Fireball.onChat(PlayerChatEvent)怎麼會被註冊呢?

因爲當你構建的Fireball一個實例,thisFireball在執行時被構建。該編譯時thisSpell,但如果你要打印出this.getClass()(即使在Spell構造函數),它會顯示Fireball

因此,如果registerEvents正在注視對象的執行時類型和與反射發現的事件處理程序,它會看到onChat

1

不知道API的實現,我只能猜測。

要獲得註釋,首先必須使用Object.getClass()獲得適用的類。這是多態的,所以它返回Fireball.class,那麼當反射性地搜索註釋時,找到在FireballSpell中找到的那些。

0

Fireball.onChat(PlayerChatEvent)也被註冊,因爲您使用super(),它調用超類的構造函數。

this始終引用調用該類的實例。

由於不存在構造函數和Fireball類中使用的構造函數的等價關係,您應該可以省略Fireball構造函數,而不會影響結果。

因此,最後每個@EventHandler每個咒語子類的註釋方法都被註冊。

相關問題