继承的主要目的是提供通用功能并描述类之间的通用性。我建议你描述两个人类的特征(万无一失和易犯错误)会分散注意力并引起混淆。
关于人类的“共同点”是什么?所有人都有一个公共的“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