黑马程序员技术交流社区

标题: 装饰设计模式的一个小疑问 [打印本页]

作者: 付江涛    时间: 2014-7-15 16:24
标题: 装饰设计模式的一个小疑问
本帖最后由 付江涛 于 2014-7-17 16:28 编辑

在讲装饰和继承时,老师讲了一个MyReader的例子:
  1. MyReader//专门用于读取数据的类。
  2.         |--MyTextReader
  3.                 |--MyBufferTextReader
  4.         |--MyMediaReader
  5.                 |--MyBufferMediaReader
  6.         |--MyDataReader
  7.                 |--MyBufferDataReader
复制代码
通过简单优化:
  1. class MyBufferReader
  2. {
  3.         MyBufferReader(MyTextReader text)
  4.         {}
  5.         MyBufferReader(MyMediaReader media)
  6.         {}
  7. }
复制代码
扩展性很差。找到其参数的共同类型。通过多态,可以提高扩展性:
  1. class MyBufferReader extends MyReader //就是搞不懂这为什么要继承MyReader
  2. {
  3.         private MyReader r;
  4.         MyBufferReader(MyReader r)
  5.         {}
  6. }
复制代码

问题来了,MyBufferReader为什么要继承MyReader?如果不继承也没影响啊

而且上一课讲的PersonDemo例子中也没继承。
  1. class Person
  2. {
  3.         public void chifan()
  4.         {
  5.                 System.out.pritln("吃饭");
  6.         }
  7. }

  8. class SuperPerson //没继承
  9. {
  10.         private Person p;
  11.         SuperPerson(Prson p)
  12.         {
  13.                 this.p=p;
  14.         }
  15.         public void superChiFan()
  16.         {
  17.                 System.out.println("开胃酒");
  18.                 p.chifan();
  19.                 System.out.println("甜点");
  20.         }
  21. }
复制代码

搞不明白,为什么要继承




作者: icris    时间: 2014-7-15 23:06
看 JDK API 得知,BufferedReader 从 Reader 继承了两个方法(read和read…),如果不继承 Reader ,而又没有自己写一个,BufferedReader 就会少两个方法。
比如如果 Person 类有呼吸、走路、睡觉等等方法,如果 SuperPerson 不继承 Person ,就需要自己实现所有方法(即使他们跟 Person 完全一样而且所有 Person 子类都没有重写他们),否则就会出现 Person 会走路会睡觉会呼吸,而 Superperson 除了优雅地吃饭以外什么都不会…自己实现当然不如继承方便
作者: wisely    时间: 2014-7-15 23:10
可以不继承,但是想用到Myreader的方法时就要自己再写,麻烦。
作者: 付江涛    时间: 2014-7-16 09:02
icris 发表于 2014-7-15 23:06
看 JDK API 得知,BufferedReader 从 Reader 继承了两个方法(read和read…),如果不继承 Reader ,而又没 ...

恩 懂了 继承就是为了可以直接调用父类的方法,直接super就行了
作者: 付江涛    时间: 2014-7-16 09:04
wisely 发表于 2014-7-15 23:10
可以不继承,但是想用到Myreader的方法时就要自己再写,麻烦。

恩恩  明白了  就是可以直接super父类方法吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2