簡體   English   中英

在Abstract類上實現偵聽器是個好主意嗎?

[英]Is it a bad or good idea to implement a Listener on an Abstract class?

我正在為當前使用Java(這里是新手程序員)的游戲編寫代碼, 但是我不確定是否存在危險或好處,或者如果應該的話,不確定是否具有初始化顯示模式並進入游戲循環的抽象類 ,該類實現了關鍵偵聽器用於控制

Abstract ClassInterfaceBaseClass之間,即它可以具有一些已實現的方法和一些未實現的方法。

具有通用實現的所有子類方法都可以在Abstract類本身中實現。

如果您認為您的Listener實現在抽象類的大多數實現類中是通用的,那么我認為在抽象類中定義偵聽器是完全可以的。 如果實現不同,但是大多數實現類都需要相同的方法,則將簽名定義為抽象類中的抽象方法。 如果沒有什么共同之處,那么我認為您最好不要在抽象類中使用它。

對於我的偵聽器,有兩個原因(我可以想到),您希望使用接口而不是抽象類。

  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名稱。

抽象類是無法實例化其對象的類,對於任何控件的關鍵偵聽器,您都需要將游戲的每個定義都包含在一個類或一個抽象類中,無論您使用的是哪個類(包括偵聽器)。

對於任何對象,要模擬哪個類的模型取決於是否有任何對象在游戲中扮演任何角色,例如,某些類是父類,那么在任何將不會創建人類對象的項目中,HumanBeing類類,您一定會將其擴展到男人,工人,女人等,因此讓HumanBeing成為抽象類

這就是數據建模的一部分。 很抱歉,當我在上一個回答中說您不能向抽象類添加偵聽器時,我錯了,您當然可以,但是您必須考慮要制作哪些類以及這些類的作用是什么那么您可以決定是否將Listener包含在Abstract類中 (軟件工程的一部分)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM