在层次结构外部调用对象的超类方法

时间:2014-02-07 21:57:45

标签: java class design-patterns multiplayer

我正在开发一款游戏,这是我第一次添加多人游戏(使用kryonet),它被设计为单人游戏,然后我添加了多人游戏。我想到了一种优雅的方式来制作相同的代码双向工作。代码可以工作,除了我的解决方案附带的无限循环。

在我的游戏类中,我将foo变量实例化为Foo,当游戏是单人游戏时,将SubFoo实例化为多人游戏,如下例所示。基本上,SubFoo会覆盖负责世界变化事件的Foo方法,进行所需的多人游戏调用然后“继续”该方法。

问题是当客户端从服务器收到数据包时,它必须以某种方式调用foo,以便它跳过它的重写方法,因此它不会将更改发送回服务器等等。

我尝试在Foo类中添加一个根变量,希望如果我调用它,它将调用其类的方法,但没有成功。如果foo调用像foo.fooCaller().method();这样的方法,我也可以使它工作。

我应该提一下我的服务器是主机。对于5个玩家,4个是客户端,1个是主机。如果有更好的方式来做这件事,比如模式,我会很高兴听到它。

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 
}

1 个答案:

答案 0 :(得分:0)

由于您要调用Foo类的方法,因此不应实例化SubFoo对象。您应该实例化Foo对象。另一方面,如果您需要SubFoo个对象上的特定函数,则应该继承特定函数而不覆盖它。

最后,您必须确定SubFoo类的method类的功能是什么。此功能不能随上下文而改变,因为编译器无法猜测您要执行哪些功能。

您可以根据函数参数使用polymorphism来完成此操作。例如:

class SubFoo{

    //Inherit the method functionality from Foo
    ...


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

}

最后,问题是您希望该方法做什么。

希望我帮忙!