簡體   English   中英

在層次結構之外調用對象的超類方法

[英]Call an object's superclass methods outside the hierarchy

我正在開發一個游戲,這是我第一次添加多人游戲(帶有kryonet),它最初是作為單人游戲設計的,然后又添加了多人游戲。我想到了一種優雅的方式來使相同的代碼雙向工作。 該代碼有效,除了我的解決方案附帶的無限循環。

在我的游戲類中,當游戲為單人游戲時,我將foo變量實例化為Foo,將多人游戲時的foo變量實例化為SubFoo,例如下面的示例。SubFoo基本上重寫了Foo的方法,該方法負責改變世界的事件,進行所需的多人游戲調用,然后“繼續“ 方法 。

問題在於,當客戶端從服務器接收到數據包時,它必須以某種方式調用foo,從而使其跳過被覆蓋的方法,從而不會將更改發送回服務器,依此類推。

我嘗試在Foo類中添加一個根變量,希望如果我調用它,它將調用其類的方法,但沒有成功。 如果foo調用諸如foo.fooCaller().method();類的方法,我也可以使其工作foo.fooCaller().method();

我應該提到我的服務器是一台主機。所以對於5個玩家,4個是客戶端,一個是主機。 如果有更好的方法,例如模式,我會很高興聽到它。

一個示例,其中Foo和SubFoo是我的World和WorldNetwork的簡化版本。

public class Foo { // as the main , singleplayer world

    public Foo root;

    public Foo() {
        root = Foo.this;
    }

    public void method() {
        System.out.println( "This is foo" );
    }

}

// as the extension of the main world that manages the server/client calls
public class SubFoo extends Foo { 

    @Override
    public void method() {
        System.out.println( "this is super foo" );
        super.method();
    }

}

public static void main(String[] args) {
    Foo foo = new SubFoo();
    foo.root.method(); // make this skip the SubFoo method
    foo.method(); // this should execut normally 
}

由於您要調用Foo類的方法,因此不應實例化SubFoo對象。 您應該實例化一個Foo對象。 另一方面,如果您需要SubFoo對象上的特定功能,則應繼承該特定功能而不覆蓋它。

最后,您必須確定method調用中將具有SubFoo類的功能。 此功能不能隨上下文而更改,因為編譯器無法猜測您要執行的功能。

您可以使用基於函數參數的多態來實現。 例如:

class SubFoo{

    //Inherit the method functionality from Foo
    ...


    //Define new method with another signature to seperate its call
    void method (Object arg);

}

最后,問題是您想要該方法做什么。

希望我能幫上忙!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM