簡體   English   中英

類層次結構中的Java可選接口

[英]Java optional interface in class hierarchy

假設您有一個大約30個類的Java類層次結構,具有基類BaseClass和兩個主要子類(SubclassA,SubclassB),每個子類具有多個子類。 其中一些子類具有某種行為。 假設你可以“戳”它們,改變它們的狀態。 (這是向現有層次結構添加行為的新要求。“Poke”對大多數類來說毫無意義。)

interface Pokeable {
  void poke();
  int getTimesPoked();
}


public class Pokey extends SubclassB 
implements Pokeable {
  private int timesPoked = 0;
  public void poke() {
    timesPoked++;
  }
  public int getTimesPoked() {
    return timesPoked;
  }
}

這應該通過只在那些需要它的類中實現Pokeable來完成,然后在所有代碼中執行以下操作,這些代碼必須戳掉任何可以被攻擊的對象嗎?

public void process(BaseClass b) {
  if (b instanceof Pokeable) {
    ((Pokeable)b).poke();
  }
}

或者整個層次結構是否應該實現Pokeable,以便為真正可能的少數人提供服務?

interface Pokeable {
  void poke();
  int getTimesPoked();
  boolean isReallyPokeable();
}

public class BaseClass implements Pokeable {
  public void poke() {}
  public int getTimesPoked() { return 0; }
  public boolean isReallyPokeable() { return false;}
}

public class Pokey {
  private int timesPoked = 0;
  @Override
  public void poke() {
    timesPoked++;
  }
  @Override
  public int getTimesPoked() {
    return timesPoked;
  }
  @Override
  public boolean isReallyPokeable() {
    return true;
  }
}

public void process(BaseClass b) {
  b.poke();
}

編輯補充:這是一個雙重調度問題。 “撲克”代碼對某個對象執行某些操作時,如果該對象是“可戳”的,則必須調用“poke()”,否則不能。 你是否“戳()”取決於是否想要戳戳以及物體是否接受戳戳。 我可以使用訪問者模式,但這似乎使它更復雜。

如果一個類不可用,我建議不要實現Pokeable接口,因為這會Pokeable感到困惑。

請改用以下方法之一。

  • 創建一個實現PokableBaseClass的抽象或具體子類,並讓所有可能的Pokeable子類擴展它。 如果通過所有實現類中的相同邏輯實現poke()則此方法很有效。
  • 讓每個子類單獨實現Pokeable

我認為通過一個名為“isReallyX”的方法是一個警示標志。 如果有人一眼就看到一個班級,並且發現它是“可伸縮的”,他們可能會試圖捅它並最終出現意想不到的行為,因為它並不是真的可以捅。

我會采取你以前的方法,它不會誤導外部程序員(或者在忽略這段代碼兩個月之后你自己!)

如果您不想實現父類的所有方法,則子類可以是抽象的。 但....

或者整個層次結構是否應該實現Pokeable,以便為真正可能的少數人提供服務?

絕對沒有...不可修改的類不應該實現可擴展的接口。

這應該通過只在那些需要它的類中實現Pokeable來完成,然后在所有代碼中執行以下操作,這些代碼必須戳掉任何可以被攻擊的對象嗎?

這是一個稍好的模型......然而,這是一個非常程序化的設計。

還可以將<Pokeable>對象的集合保存在某處,然后快速迭代通過該集合將它們全部戳掉?

你可以讓一個可以選擇的課程注冊一個事件調度員嗎? ......所以當某個事件發生時,所有的課程都被戳了?

暫無
暫無

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

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