0

我正在为当前在 java 中的游戏编写代码(这里是新手程序员),但我不确定危险或好处,或者我是否应该拥有初始化显示模式并进入游戏循环的抽象类,它 实现了一个关键的监听器用于控制

4

3 回答 3

2

Abstract Class介于Interface和和之间,BaseClass即它可能有一些已实现的方法和一些未实现的方法。

子类的所有具有共同实现的方法都可以在抽象类本身中实现。

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

于 2012-11-03T05:38:41.343 回答
0

有两个原因(我能想到)你希望你的听众更喜欢接口而不是抽象类。

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

  2. 您可能有一个已经从另一个类继承的现有类,但您还希望能够将其标记为侦听器。

如果您决定使用接口但仍希望共享一些通用实现,则实现此目的的模式是创建侦听器接口和抽象实现,例如

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用于这些类型的侦听器实现的名称。

于 2015-12-07T16:08:21.887 回答
-1

抽象类是一个其对象无法实例化的类,对于任何控件的关键侦听器,您需要将游戏的每个定义包含到您使用的类或抽象类中,并且包括侦听器。

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

这就是数据建模部分。很抱歉,当我在之前的回答中说您不能将侦听器添加到抽象类中时,我错了,您当然可以,但是您必须考虑要创建哪些类以及这些类的角色是什么那么您可以决定是否将 Listener 包含到 Abstract 类中(软件工程的一部分)

于 2012-11-03T06:22:51.970 回答