繼承的主要目的是提供通用功能並描述類之間的通用性。我建議你描述兩個人類的特徵(萬無一失和易犯錯誤)會分散注意力並引起混淆。
關於人類的「共同點」是什麼?所有人都有一個公共的「do_task()」方法和一個私有/受保護的「do_something()」方法。因此,我們描述了它所謂的「人」
public abstract class Human
{
// describes commonality
public abstract void do_task();
// provides common functionality
protected virtual void do_something()
{
throw new Exception("I made a mistake");
}
}
現在的「繼承」類實現自己特定的邏輯爲do_task()方法,但它們共享保護do_something的通用功能()方法的超類
public class InfallibleHuman : Human
{
public override void do_task()
{
try
{
do_something();
}
catch
{
// never throw an exception
// because I never make mistakes
}
}
}
public class FallibleHuman : Human
{
public override void do_task()
{
do_something();
// always throw an exception if
// something goes wrong because I'm accountable
// for my own actions
}
}
現在,我們已經使用了繼承來形容人與人之間的共性並提供一個默認,共同實現,但子類的版本增加了,我們用了「易犯錯誤」和「無過失」,以具體行爲描述,這與繼承無關。
現在,如果您有使用人類的東西,並且會接受任何人類,您可以使用InfallibleHuman或FallibleHuman。
public void ImPrettyTolerantOfMistakes()
{
try
{
Human anyHumanWillDo = new FallibleHuman();
anyHumanWillDo.do_task();
Human anotherHuman = new InfallibleHuman();
anotherHuman.do_task();
}
catch
{
// I'll take care of a human
// making a mistake
}
}
但是,如果你正在使用的東西是不寬容的人是會犯錯誤的,你可以使用一個完美的人......
public void ImIntolerantOfHumansWhoMakeMistakes()
{
InfallibleHuman onlyAPerfectHumanWillDo = new InfallibleHuman();
onlyAPerfectHumanWillDo.do_task();
// if this guy fails, I'm dead meat
}
我希望事情清除的東西了你一下。
+1。優秀點。這些解釋客體關係的比喻通常會失敗;它們通常很少或沒有清晰度,並導致無問題成爲問題。 – 2010-05-31 19:05:50
我同意你所說的,但是OO已經被教給了我們想要試圖建模它們之間的關係的目標,當我們確實遇到這種情況時,它有時會感到古怪。 – dhruvbird 2010-06-01 08:00:50
Shel Silverstein有一首名爲_The Zebra Question_的詩,其中有人問斑馬,如果他是黑色的白色條紋或白色的黑色條紋。斑馬不直接回答...但是它可能會問一些關於提問者的類似問題(「你對壞習慣有好處,或者有好習慣嗎?」)因爲斑馬不會讓這個傢伙閉嘴:「我永遠不會問斑馬/關於條紋/再次。「 :) – HostileFork 2010-06-13 04:49:42