class Food{}
class Meat extends Food{}
class Animal{
void feed(Food f){}
}
class Lion extends Animal{
void feed(Meat m){}
}
void foo(Animal a){
Food f = new Food();
a.feed(f);
}
如果我们发送至foo(new Lion())
?
我知道它会出错,但我需要解释
Your Lion
可以吃Meat
,但它也可以吃任何种类的食物(如菠菜)。
If your Lion
不能吃任何种类的Food
,那么它不能被认为是一个实现Animal
.
当决定使用子类化和类继承作为构建程序的方法时,理解这一点至关重要:不要使子类比接口或超类更具体。
为了使子类化以解决问题(而不是制造问题)的方式工作,您需要遵守以下准则:All subclasses must be functionally equivalent to the super-class (Liskov Substitution Principle) http://en.wikipedia.org/wiki/Liskov_substitution_principle这意味着提供对三个不同数据库的数据库访问的三个类是公共类的子类(或者可能共享公共接口)的良好候选者,因为“功能”是“提供数据库访问”。
你在哪里Lion
例子不足的是根据你的定义Animal
在现实世界中,狮子不是Animal
因为现实世界的狮子不吃任何种类的东西Food
。现实世界中的狮子的进食能力比未知动物的一般定义更为具体。正是这种功能差异使得将现实世界中的狮子建模为动物的这个具体定义不合适。
您可以通过以下方式轻松解决此问题Animal
“吃食物”方法扔IncompatibleFoodException
,这改变了一个的定义Animal
从“吃食物”到“吃或拒绝食物”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)