[英]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
感到困惑。
請改用以下方法之一。
Pokable
的BaseClass
的抽象或具體子類,並讓所有可能的Pokeable
子類擴展它。 如果通過所有實現類中的相同邏輯實現poke()
則此方法很有效。 Pokeable
我認為通過一個名為“isReallyX”的方法是一個警示標志。 如果有人一眼就看到一個班級,並且發現它是“可伸縮的”,他們可能會試圖捅它並最終出現意想不到的行為,因為它並不是真的可以捅。
我會采取你以前的方法,它不會誤導外部程序員(或者在忽略這段代碼兩個月之后你自己!)
如果您不想實現父類的所有方法,則子類可以是抽象的。 但....
或者整個層次結構是否應該實現Pokeable,以便為真正可能的少數人提供服務?
絕對沒有...不可修改的類不應該實現可擴展的接口。
這應該通過只在那些需要它的類中實現Pokeable來完成,然后在所有代碼中執行以下操作,這些代碼必須戳掉任何可以被攻擊的對象嗎?
這是一個稍好的模型......然而,這是一個非常程序化的設計。
還可以將<Pokeable>
對象的集合保存在某處,然后快速迭代通過該集合將它們全部戳掉?
你可以讓一個可以選擇的課程注冊一個事件調度員嗎? ......所以當某個事件發生時,所有的課程都被戳了?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.