黑马程序员技术交流社区

标题: 提一个看视频遇到的装饰类的问题 [打印本页]

作者: yjsf216    时间: 2015-3-7 13:25
标题: 提一个看视频遇到的装饰类的问题
本帖最后由 yjsf216 于 2015-3-7 16:40 编辑
  1. class MyBufferedReader extends MyReader{
  2.         private MyReader r;
  3.         MyBufferedReader(MyReader r){
  4. }
  5. }
复制代码

MyBufferedReader是 MyReader装饰类,为什么还要继承 MyReader?
  1. class SuperPerson{
  2.       private Person p;
  3.       SuperPerson(Person p){
  4.       ........
  5.       }
  6. ......
  7. }
复制代码
就不需要继承Person呢?
作者: yjsf216    时间: 2015-3-7 16:19
为什么没有人回答呢{:3_62:}
作者: 突然世界晴    时间: 2015-3-7 18:49
装饰类就是加强功能啊,肯定要在原有的类上,要么将对象传入,要么继承
作者: zfgrinm    时间: 2015-3-7 20:03
装饰类一般是将要装饰的类作为参数传递到构造函数中,然后提供更强大的功能
作者: z47057554    时间: 2015-3-8 05:00
本帖最后由 z47057554 于 2015-3-8 05:04 编辑

有点明白你的意思了,你这两个例子的区别就是继承,和类中使用了到了某个类个类型的区别
class MyBufferedReader extends MyReader{}
MyBufferedReader 可以在拥有MyReader中所有的方法基础上,另外增加新的功能,并增加增强的功能(这一部分就是装饰),所以才叫装饰类
而class SuperPerson{}
首先,如果SuperPerson{}拥有Person中的全部功能,那就需要继承,不继承的后果就是你要自己重新写完与Person完全
一样的功能,再加上自己的功能。
其次,SuperPerson跟Person没有关系,只是类中使用到了Person对象,那你那段代码的意义下面一样
SuperPerson{
String name;
SuperPerson(String name){//我能因为只是使用了一个String对象就继承String类吗;我要是同时使用好些类型,那不挂了吗

}
}
另外感觉你对流对象有点理不清关系,举个例子:
BufferedReader bffr=BufferedReader(new FileReader("xxx.txt"));
BufferedReader接受过FileReader()后,对"xxx.txt"进行操作的是BufferedReader的字符流对象(注意它还是个流对象,它
需要有对字符流进行操作的方法),而不在是FileReader的对象,如果BufferedReader
不继承Reader的话,那么它要操作文件,必有自己定义方法来实现操作功能。








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