最好的答案將取決於這些類的用例和環境。作爲開發應用程序或框架的團隊的一部分,採用該團隊使用的設計模式比尋求「完美」解決方案更可取,因爲它可以使其他人更容易採用和維護您的代碼。
您如何期待這些類的使用和擴展也很重要。你會期待'Square'在將來需要移動嗎?Shape的可移動性總是靜態的,或者它可能作爲動態屬性更有用? Move()對於不是Shapes的類有任何值嗎?如果可移動性的動態屬性是有用的,可以這樣考慮:
public abstract class Shape
{
public bool isMovable()
{
return false;
}
public virtual void Move()
{
if (!isMovable() {
throw new NotSupportedException();
} else {
throw new BadSubclassException();
}
}
}
你的子類可以然後覆蓋isMovable提供靜態或動態行爲,可以進一步修改或子類隨着時間的推移,只要你的文檔使清楚的是,移動應始終在移動的調用之前。默認行爲應基於您期望使用您的代碼的其他人的期望,這取決於他們如何實施相關設計模式。
作出這些決定的挑戰的一個很好的例子,可以通過查看如何集合類的易變性在不同的框架已經進化歷史中找到。已經有設計將可變類(集合,數組,字典等)作爲基類,在子類中實現了不變性,以及相反。有兩種方法,以及一個動態的方法有效參數,但對於一個框架,用戶最重要的因素是一致性,因爲什麼是正確的是真的,什麼是最簡單的事來使用,提供安全性能不會受到影響。
這個。 「如何不繼承一些基本行爲」這個問題的答案始終是「不要從一開始就繼承它」。 – KeithS
@KeithS,這是正確的。停止繼承只是看待繼承的反面。所以,希望這會幫助OP認爲前進的另一種方式。 :) –
@Mike,'IMovable'怎麼樣? – smartcaveman