【转】很形象的接口的使用——针对初学者

里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下。

我们拿人和程序员举个例子。人是一个大类,程序员是继承自人的子类。看看这句话:人需要吃饭。这句话我们把“人”换成“程序员”,就是:程序员需要吃饭,这样换不会有什么问题。

现在我们反过来,把“程序员可以用计算机写程序”里边的程序员换成“人”,就是:人可以用计算机写程序。这样就不一定正确了,否则问题可就大了,我们这些程序员只怕没得饭吃了。

这个就是里氏代换原则:使用父类的地方肯定可以用它的一个子类来替换掉,但是使用一个子类的时候用它的父类来替换就不一定正确了。

好,现在我们回到程序设计里边来。看看下面的程序:           一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。

public interface 人

{

      void 吃饭();

      void 睡觉();

}

 

public class 学生 implements 人

{

      public void 吃饭()

      {

         //去食堂吃饭

      }

     public void 睡觉()

     {

        //回寝室睡觉

     }

     ...//其他特有方法,比如泡妞、打游戏

}

 

public class 老师 implements 人

{

      public void 吃饭()

     {

         //回家吃饭

     }

     public void 睡觉()

     {

         //回家睡觉

     }

     ...//其它特有方法,比如为生儿育女传宗接代的历史使命努力等不足为外人道的事情

}

 

public class 学校

{

     public void 开饭(人 ren)

     {

        ren.吃饭();

     }

     public void 放学(人 ren)

     {

       ren.睡觉();

     }

}

这里就用到了里氏代换原则,"开饭()"和"放学()"的参数都是人,那么这个地方如果换成学生和老师肯定也可以。

人 a = new 学生();

学校.开饭(a);

学校.放学(a);

这样执行的结果就是学生回寝室吃饭。

人 b = new 老师();

学校.开饭(b);

学校.放学(b);

这样执行的结果就是老师回家吃饭。

为什么要这样写呢?这样写有什么好处呢?我在开饭的时候完全可以直接调用"学生.吃饭();"、"老师.吃饭();"啊。接着看。

有一天,学校里来了第三种人,家长。家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。这个时候学校这个系统该怎么处理呢?如果原来没有定义"人"这个接口那就麻烦啦,所有用到人的地方代码都要改。

现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。好,看代码:

public class 家长 implements 人

{

      public void 吃饭()

     {

                 //下馆子

      }

     public void 睡觉()

    {

       //去旅馆睡觉

     }

    ...//其它特有方法,比如会见老师,晓之以钱,动之以利等等,不一而足

}

在调用的时候不需要修改任何代码,还和原来一样:

人 c=new 家长();

学校.开饭(c);

学校.放学(c);

轻松搞定家长的食宿问题! 这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!

转载于:https://www.cnblogs.com/JaneTang/archive/2009/11/13/1602693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值