在Abstract类上实现Listener是一个坏主意还是好主意?

时间:2012-11-03 05:23:29

标签: java listener abstract-class

我正在为目前使用java的游戏编写代码(这里是新手程序员),但是我不确定是否有危险或好处,或者我是否应该使用抽象类来初始化displaymode并进入游戏循环 THAT实现控件的关键监听器

3 个答案:

答案 0 :(得分:2)

Abstract Class介于InterfaceBaseClass之间,即它可能包含一些已实现的方法和一些未实现的方法。

具有通用实现的所有子类方法都可以在Abstract类本身中实现。

如果您认为您的Listener实现在抽象类的大多数实现实现类中都很常见,那么我认为在抽象类中定义侦听器是完全正确的。如果实现不相同但在大多数实现类中需要相同的方法,则将签名定义为抽象类中的抽象方法。如果没有什么是常见的,那么我认为你最好不要在抽象类中使用它。

答案 1 :(得分:0)

有两个原因(我可以想到)你希望为听众提供接口而不是抽象类。

  1. 如果您有多个标记为abstract的侦听器,则一个类只能从一个继承,即使一个类实现多个侦听器也是有意义的。

  2. 您可能已经有一个现有的课程已经从另一个课程继承,但您也希望能够将其标记为听众。

  3. 如果您决定使用接口但仍希望共享一些常见的实现,那么实现此目的的模式是创建一个侦听器接口和一个抽象实现,例如

    interface ClickListener {
      void onLeftClickPressed();
      void onLeftClickReleased();
    }
    
    // "DefaultClickListener" and "AbstractClickListener" are also common conventions
    abstract class DoubleClickListener implements ClickListener {
      int leftClickCount;
      @Override public final void onLeftClickPressed() {
        ++leftClickCount;
        if (leftClickCount == 2) {
          onDoubleClicked();
        }
      }
      @Override public final void onLeftClickReleased() { --leftClickCount; }
    
      protected abstract void onDoubleClicked();
    }
    

    如果你的监听器接口有多种方法,那么提供一个为所有这些方法提供存根实现的适配器版本会很不错,例如

    interface ComplexListener {
      void onEvent1();
      ...
      void onEvent100();
    }
    
    abstract class ComplexListenerAdapter implements ComplexListener {
      @Override public void onEvent1() {}
      ...
      @Override public void onEvent100() {}
    }
    
    final class MySimpleListener extends ComplexListenerAdapter {
      // The only event I care about
      @Override public void onEvent42() { ... }
    }
    

    我不确定它是一个标准惯例,但我已经看到用于这些类型的侦听器实现的ListenerAdapter名称。

答案 2 :(得分:-1)

抽象类是一个无法实例化对象的类,对于任何控件的键侦听器,您需要将游戏的每个定义都包含在一个类或一个抽象类中,无论您使用哪个并包含监听器。 / p>

对于任何对象建模的对象取决于是否有任何对象在游戏中扮演任何角色,例如某些类是父类,任何项目中的HumanBeing类都不会创建对象在人类课上,你肯定会将它扩展到男人,工人,女人等,所以让HumanBeing成为一个抽象的课程

这是数据建模的一部分。 我很抱歉当我在上一个回答中说你不能将一个听众添加到一个抽象类时,我确实可以,但你肯定可以你必须考虑要制作哪些类以及它们的作用是什么只有这样你才能决定是否将Listener包含在Abstract类中(软件工程的一部分)

相关问题