首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现接口的20个类中,只有两个类中需要的方法。

实现接口的20个类中,只有两个类中需要的方法。
EN

Stack Overflow用户
提问于 2014-01-07 15:52:18
回答 5查看 147关注 0票数 1

背景

在我的应用程序(游戏)-我有一个现场经理处理不同的层次。所以我有:

接口码

代码语言:javascript
复制
//Interface to allow switching scenes (works in conjunction with SceneManager class)
//Handles rendering, logic updating (on the GL rendering thread) and user input (on the main UI thread)

public interface Scene  {

void render();
void updateLogic();
boolean onTouchEvent(MotionEvent event);

}

SceneManager类

代码语言:javascript
复制
//Scene Manager class used in conjunction with the Scene interface.  This allows for querying of the current
//scene & changing the scene using the current instance of the manager.

public class SceneManager {

private static SceneManager Instance = new SceneManager();

private Scene currentScene;

public static SceneManager getInstance(){

    return Instance;

}

public Scene getCurrentScene(){

    return currentScene;

}

public void setCurrentScene(Scene scene){

    currentScene = scene;

}

}

所以,在我的游戏回路中,我可以做这样的事情:

代码语言:javascript
复制
SceneManager.getInstance().getCurrentScene().updateLogic();
SceneManager.getInstance().getCurrentScene().render();

通过持有一个简单的int值并通过switch语句运行相应的代码,我可以轻松地更改我的级别。

代码语言:javascript
复制
switch (level){

case 1:{SceneManager.getInstance().setCurrentScene(r.level1);break


}

问题

这很好,但是在我的几个级别(20中有2个)中,我需要运行一个特定的方法,但我不想在不需要它的18个级别(通过存根方法)来实现它。

另一个选项是在循环运行时调用级别值上的开关语句,所以.

伪码

代码语言:javascript
复制
If (level==5)

  callCode(5,0);

else if (level==10)

 {callCode (10,4);}

(其中第5级和第10级是需要这段代码的级别)

....but我宁愿将所需的方法放在它对应的级别类中,只从当前场景调用该方法,因为在游戏循环本身运行平淡无奇的情况下,我不确定是否为此使用开关(或方法)- (IE,我的大部分切换语句都出现在某个级别末尾的裁剪场景中,而性能并不是问题)。就像这样:

我宁愿这样做:

代码语言:javascript
复制
SceneManager.getInstance().getCurrentScene().callCode();

其中,callCode方法将特定于级别中所需的任何值(实际上,也可以简单地依次调用公共代码的主要方法,但值不同)。

希望我说得通。

如有任何指示,将不胜感激。

编辑

试图创建这样的第二个接口:

代码语言:javascript
复制
public interface Scene2 extends Scene {

    void callCode();

}

(场景保持如上)

然后,在我的课堂上(例如,level10)

代码语言:javascript
复制
public class Level10 implements Scene2 {

    @Override
    public void render(){

        //Rendering code goes here
        mainGame.Drawsprites();  //As an example.  MainGame implements Scene and contains all my game code.  I can simply call the various methods from any of my level classes therefore I don't duplicate tons of code

    }

     @Override
    public void updateLogic(){

        //Game updates goes here (Similar to above)

    }

    @Override
    public void callCode(){

        //Level specific code here

    }

来自我的mainGame课程:

代码语言:javascript
复制
    public void doSomething(){

        SceneManager.getInstance().getCurrentScene().callCode;

    }

}
EN

回答 5

Stack Overflow用户

发布于 2014-01-07 16:09:37

如果你有你的接口Scene

代码语言:javascript
复制
public interface Scene  {

void render();
void updateLogic();
boolean onTouchEvent(MotionEvent event);

}

您可以定义另一个接口,类似于:

代码语言:javascript
复制
    public interface Scene2 extends Scene {

    void callCode();

}

然后,在您的mainGame类中,您可以:

代码语言:javascript
复制
public void doSomething(){

    Object currentScene = SceneManager.getInstance().getCurrentScene();
    if(currentScene instanceof Scene){
        ((Scene)currentScene).render();
        ((Scene)currentScene).updateLogic();
    }

    if(currentScene instanceof Scene2){
        ((Scene2)currentScene).allCode();

    }

}
票数 0
EN

Stack Overflow用户

发布于 2014-01-07 16:12:16

您应该定义一个扩展您的接口的额外层。然后,您的两个单独的场景可以实现这个接口,并且仍然可以使用更通用的接口进行调用。

这是一个示例实现:

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        SomeInterface obj1 = new SomeClass2();
        obj1.method1();
        obj1.method2();
        SomeSubInterface obj2 = new SomeClass2();
        obj2.method1();
        obj2.method2();
        obj2.method3();
    }
}

interface SomeInterface {
    void method1();
    void method2();
}

interface SomeSubInterface extends SomeInterface {
    void method3();
}

class SomeClass1 implements SomeInterface {

    @Override
    public void method1() {
        // TODO Auto-generated method stub
    }

    @Override
    public void method2() {
        // TODO Auto-generated method stub
    }
}

class SomeClass2 implements SomeSubInterface {

    @Override
    public void method1() {
        // TODO Auto-generated method stub  
    }

    @Override
    public void method2() {
        // TODO Auto-generated method stub  
    }
    @Override
    public void method3() {
        // TODO Auto-generated method stub
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-01-07 16:22:45

只是一个例子,展示了我在上面的评论中提出的解决方案。正如这里所提到的,它实现了场景特定代码的本地化,并从一般的gameloop中消除了复杂性。

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        Scene scene1 = new NormalScene();
        Scene scene2 = new SpecialScene();

        scene1.initialize();    //Does nothing
        scene2.initialize();    //Print hello world
    }
}
abstract class Scene {
    abstract void render();
    abstract void updateLogic();
    abstract boolean onTouchEvent();
    void initialize() {

    }
}
class NormalScene extends Scene {
    @Override
    void render() {
    }
    @Override
    void updateLogic() {
    }
    @Override
    boolean onTouchEvent() {
        return true;
    }
}
class SpecialScene extends Scene {
    @Override
    void render() {
    }
    @Override
    void updateLogic() {
    }
    @Override
    boolean onTouchEvent() {
        return true;
    }
    @Override
    void initialize() {
        System.out.println("Hello world");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20976025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档