请教Coolyu0916 在“我来讨论一下纯理论的老问题.长方形和正方形的继承关系” 中引出的一点疑惑

那么我们就从需求方面走

首先我们确定了人的行为
我们不可能设计一个万能的persion class
我们只要实现有限的功能,在系统中用到的,比如eat() sleep()
现在要在性别上进行区分

下面对这样的需求进行抽象

考虑到男人、女人终究是人所以和人的关系是一个继承关系 is-a,而男人或者女人又具有吃睡这么些行为,所以把这组行为做一个接口


abstract class Person {
abstract void male();
abstract void female();
}

interface Action {
void eat();
void sleep();
}

public class GkZhong extends Person implements Action {
//.......
}

当我们某一业务上面的需要(多态):


public class Service {
private Person persion;
public void setPerson(Person persion){
this.persion = persion;
}

public void fun(){
//persion.eat(); 这里窄化了,persion不可能有eat()的,但当我们set进来的是GkZhong的对象的时候是需要这么个行为的,这时候困惑了
}
}

不知道表述清楚未
[该贴被gkzhong于2007年05月12日 17:45修改过]
[该贴被gkzhong于2007年05月12日 17:45修改过]

person是不是共有eat这个行为?为什么不放在person中?

如果你非要在内部设计一个接口,那么这个接口利用strategy模式来设计
那么person应该有一个更扩大话的接口,比如action()方法,person这个类引用Action抽象接口,可以利用setter方法或者IOC来指定Action子类具体是什么。在Person.action()方法中使用Action.eat()方法。
就能满足你上述的要求了。

从抽象上来说也是合理的,不过stragety模式一般都不是用在这里的。除非碰到用like-a实在解决不了的问题的时候才会考虑到用策略模式吧~

仅供参考~