如何在JavaScript中实现这个java模式(使用继承)?

如何在JavaScript中实现这个java模式(使用继承)?,java,javascript,inheritance,Java,Javascript,Inheritance,下面是为各种游戏使用的许多引擎实现提供一个处理平衡侦听器注册的基本引擎类的java代码。e、 g.将有一个演示引擎,用于维护演示游戏的演示余额,以及同一引擎的现金版本,用于从后台获取余额等。这里的关键不是实际的java,而是如何在JavaScript中实现这种模式。我已经尝试了大约30种不同的方法,包括使用John Resigs的“简单JavaScript继承”和“JavaScript:the definitive Guide”中定义的extend()sugar,使用各种模块模式,使用this=

下面是为各种游戏使用的许多引擎实现提供一个处理平衡侦听器注册的基本引擎类的java代码。e、 g.将有一个演示引擎,用于维护演示游戏的演示余额,以及同一引擎的现金版本,用于从后台获取余额等。这里的关键不是实际的java,而是如何在JavaScript中实现这种模式。我已经尝试了大约30种不同的方法,包括使用John Resigs的“简单JavaScript继承”和“JavaScript:the definitive Guide”中定义的extend()sugar,使用各种模块模式,使用this=this等。这些方法都不能解决这个问题

以下是可用的java代码:

文件引擎.java:

package com.test;
public abstract class Engine {
    BalanceListener externalBalanceListener = null;
    double balance = 0;
    public void registerBalanceListener(BalanceListener balanceListener) {
        externalBalanceListener = balanceListener;
        balanceListener.update(balance);  // call once when first register
    }
    public double getBalance() {
        return balance;
    }
    protected void setBalance(double newBal) {
        if (newBal != balance) {
            balance = newBal;
            if (externalBalanceListener != null) {
                externalBalanceListener.update(newBal);
            }
        }       
    }
    public abstract double startGame(double stake, int numLines);
}
文件BalanceListener.java

package com.test;
public interface BalanceListener {
    void update(double balance);
}
package com.test;
import java.util.Random;

public class DemoEngine extends Engine {
    public DemoEngine() {
        setBalance(10000);
    }
    public double startGame(double stake, int numLines) {
        double wonAmount;
        Random random = new Random();

        setBalance (getBalance() - (stake * numLines));

        // some game logic
        wonAmount = Math.round((random.nextDouble() * 10)) * stake;
        setBalance (getBalance() + wonAmount);          
        return wonAmount;
    }
}
package com.test;

public class DemoGame {

    public class MyListener implements BalanceListener {
        public MyListener(){
        }
        public void update(double balance) {
            System.out.println("new balance: " + balance);
        }
    }

    public static void main(String[] args) {
        Engine engine = new DemoEngine();

        DemoGame demoGame = new DemoGame();

        BalanceListener balanceListener = demoGame.new MyListener();

        engine.registerBalanceListener(balanceListener);

        engine.startGame(10, 20);
    }
}
文件DemoEngine.java

package com.test;
public interface BalanceListener {
    void update(double balance);
}
package com.test;
import java.util.Random;

public class DemoEngine extends Engine {
    public DemoEngine() {
        setBalance(10000);
    }
    public double startGame(double stake, int numLines) {
        double wonAmount;
        Random random = new Random();

        setBalance (getBalance() - (stake * numLines));

        // some game logic
        wonAmount = Math.round((random.nextDouble() * 10)) * stake;
        setBalance (getBalance() + wonAmount);          
        return wonAmount;
    }
}
package com.test;

public class DemoGame {

    public class MyListener implements BalanceListener {
        public MyListener(){
        }
        public void update(double balance) {
            System.out.println("new balance: " + balance);
        }
    }

    public static void main(String[] args) {
        Engine engine = new DemoEngine();

        DemoGame demoGame = new DemoGame();

        BalanceListener balanceListener = demoGame.new MyListener();

        engine.registerBalanceListener(balanceListener);

        engine.startGame(10, 20);
    }
}
文件DemoGame.java

package com.test;
public interface BalanceListener {
    void update(double balance);
}
package com.test;
import java.util.Random;

public class DemoEngine extends Engine {
    public DemoEngine() {
        setBalance(10000);
    }
    public double startGame(double stake, int numLines) {
        double wonAmount;
        Random random = new Random();

        setBalance (getBalance() - (stake * numLines));

        // some game logic
        wonAmount = Math.round((random.nextDouble() * 10)) * stake;
        setBalance (getBalance() + wonAmount);          
        return wonAmount;
    }
}
package com.test;

public class DemoGame {

    public class MyListener implements BalanceListener {
        public MyListener(){
        }
        public void update(double balance) {
            System.out.println("new balance: " + balance);
        }
    }

    public static void main(String[] args) {
        Engine engine = new DemoEngine();

        DemoGame demoGame = new DemoGame();

        BalanceListener balanceListener = demoGame.new MyListener();

        engine.registerBalanceListener(balanceListener);

        engine.startGame(10, 20);
    }
}
这里是一个简单的(失败的)尝试,以使相同的东西在JavaScript中工作(请参阅)

显然,我不知道我在做什么(尽管读了几本JS书籍)。我假设我可以使用组合而不是尝试继承,但这限制了语言的使用以及可以实现的模式

编辑:这是肖恩·韦斯特的答案的工作版本。看


对于来自Java的人来说,这似乎很奇怪,但在您的尝试中,您希望改变这一点:

DemoEngine.prototype = Engine;
为此:

DemoEngine.prototype = new Engine();

如果您想了解更多信息,这个答案非常好:

这看起来不像是很多代码……到目前为止您做了什么?结果,成功了!尽管阅读了所有经典的(难以理解的)JS书籍和文章,但仍然对JS继承感到困惑(是的,我是Java开发人员)。我的大脑不够大,无法同时容纳所有必需的JS语言概念(相比之下,java继承微不足道)。