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

07-05-12 gkzhong
         

那么我们就从需求方面走

首先我们确定了人的行为

我们不可能设计一个万能的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 {
//.......
}
<p>

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

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

不知道表述清楚未

[该贴被gkzhong于2007年05月12日 17:45修改过]

[该贴被gkzhong于2007年05月12日 17:45修改过]

         

togoever
2007-10-01 13:53

http://www.jdon.com/jivejdon/thread/32771.html

rainerWJY
2007-10-01 22:20

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

rainerWJY
2007-10-01 22:29

如果你非要在内部设计一个接口,那么这个接口利用strategy模式来设计

那么person应该有一个更扩大话的接口,比如action()方法,person这个类引用Action抽象接口,可以利用setter方法或者IOC来指定Action子类具体是什么。在Person.action()方法中使用Action.eat()方法。

就能满足你上述的要求了。

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

仅供参考~