首页 新闻 会员 周边

Liskov替换原则--LSP 相关问题

0
悬赏园豆:50 [已关闭问题] 解决于 2013-08-21 20:22

以那个什么鸟的例子开始。就不写代码了描述以下。

  1. 比如鸟类刚开始设计:叫,飞,两个方法。
  2. 大雁继承的时候是没有问题的。
  3. 但是当企鹅继承的时候就会有问题,因为企鹅是没有飞这个方法的。

所以需要将飞这个接口重新封装出来,叫什么IFlyable什么的,这个是具体怎么搞的来着,现在喷到这个问题,想解决。

另外在调用的时候怎么搞?如果有个从设计到调用的鸟例子就更好了。让我醍醐灌顶一下。

作为博问活跃高帅富。50园豆奉上,期待您的精彩回答。

--修改1:

namespace DesignPattern.Lsp
{
    public interface IBird
    {
        void Fuck();
    }

    public interface IFlyable
    {
        void Fly();
    }

    public class NormalBird : IBird
    {
        public void Fuck()
        {
            throw new NotImplementedException();
        }
    }

    public class QQBird : IBird,IFlyable
    {
        public void Fuck()
        {
            throw new NotImplementedException();
        }
        public void Fly()
        {
            throw new NotImplementedException();
        }
    }

    public interface IBirdApp
    {
        void UseBird(IBird bird);
    }

    public class NormalBirdApp:IBirdApp
    {
        public void UseBird(IBird bird)
        {
            bird.Fuck();
            IFlyable flyableBird = bird as IFlyable;
            flyableBird.Fly();
        }
    }

    public class QQBirdApp : IBirdApp
    {
        public void UseBird(IBird bird)
        {
            bird.Fuck();
        }
    }
}

是这么搞吗?

小AI的主页 小AI | 菜鸟二级 | 园豆:354
提问于:2013-08-19 23:29
< >
分享
其他回答(4)
1
 1 // 设计两个接口
 2 public interface IBird
 3 {
 4   public void  Fuck();
 5 }
 6 
 7 public interface IFlayable{
 8   fly();  
 9 }
10 
11 // 大雁,叫、飞
12 public class NormalBird : IBird, IFlayable
13 {
14         
15 }
16 // 企鹅:叫
17 public class QQBird : IBird
18 {
19 }
View Code

 

收获园豆:5
乐享程序员 | 园豆:930 (小虾三级) | 2013-08-20 01:09

兄台这是给我的代码加注释玩玩吗。。哈哈

支持(0) 反对(0) 小AI | 园豆:354 (菜鸟二级) | 2013-08-20 15:05
1

阐明真实的业务问题更好。比喻有时候很拙劣,大家对怎么使用Bird有不同的理解,而如何使用才是设计的关键,而不是所谓的模式本身。

收获园豆:5
予沁安 | 园豆:214 (菜鸟二级) | 2013-08-20 01:28

上面的用法是对具体业务的抽象,业务我一句话说不清楚,说了不一定看的清楚。上面的那个我后来写的例子就是我实际的用法

支持(0) 反对(0) 小AI | 园豆:354 (菜鸟二级) | 2013-08-20 15:06

@小AI: IFlyable的例子,直接看书 《Head First Design Pattern》, 那里已经讲得很清楚了。

但是,我仍然觉得业务分析的个瓶颈。说不清,说明业务分析的不清楚,内容多说明拆分的不够细。

我经常看到的情况是,开发人员对业务分析的不足却喜欢用技术手段解决,有个成语,叫做“缘木求鱼”。

支持(0) 反对(0) 予沁安 | 园豆:214 (菜鸟二级) | 2013-08-20 23:06

@予沁安: 

业务的话我要说有得说,很点大,说局部体现不出来,我这是在重构系统。

支持(0) 反对(0) 小AI | 园豆:354 (菜鸟二级) | 2013-08-21 20:47
1

这个应该是属于“接口隔离原则”

收获园豆:5
Yu | 园豆:12980 (专家六级) | 2013-08-20 08:44

这不矛盾

支持(0) 反对(0) 小AI | 园豆:354 (菜鸟二级) | 2013-08-20 15:06
1
鸟也不是都会飞的,所以你不能直接给 Bird 添加 Fly 接口。
 
企鹅学名:Spheniscidae)是一种不会飞行的鸟类,属于企鹅目,企鹅科。
 
通常来说基类越简单越好。然后通过聚合的形式,给派生类增加接口,你可以参看 COM 的实现方式。
 
 
收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2013-08-20 09:32

是我代码的方式吗?

支持(0) 反对(0) 小AI | 园豆:354 (菜鸟二级) | 2013-08-20 15:07

@小AI: 差不多是。使用的时候会在 IBird 的实例上查找 IFlyable 接口。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-08-20 15:20
1

企鹅可以飞, 但是飞不起来

收获园豆:5
undefined | 园豆:898 (小虾三级) | 2013-08-20 15:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册