开闭原则。比如说有一个打印机的接口Printer,三个不同的打印机类HP、Epson、Canon实现了打印机接口的打印方法print(),在Output类中有类型为Printer的变量p。不管系统与那种类型的打印机相连,输出时都调用p.print()方法。而p的具体类型在运行时由系统确定。我只想问怎么理解“p的具体类型在运行时由系统确定”这句话。系统运行了是怎么确定p的具体类型的?希望各位大师指点一下,举个例子或是提供关键点的代码更好。十分感谢!
2 回答
慕森王
TA贡献1777条经验 获得超3个赞
先占个坑,明天有空过来谈谈对这个问题的看法。我来了!撒花~撒花~不知道我是否理解对了楼主的问题,暂时就我所理解的来说说自己的看法,重在交流嘛~~为了节省时间和篇幅,下文用OO来代替“面向对象”,请自行在大脑中运行replace()。首先,开闭原则是OO编程思想中的一个重要原则,既然是OO领域的,自然大前提是针对OO语言下的编码实践。同样,OO语言为我们提供了3大基本特性:抽象、封装、多态。这是所有OO语言所共通的,如果某个语言没有提供这3大特性就声称自己是OO语言,毫无疑问会被人一巴掌糊一脸翔!能够在运行时动态确定对象的类型是一种语言实现多态的前提。同样,如果一种OO语言无法在运行时确定对象的类型就说自己实现了多态,毫无疑问会被人一巴掌糊一脸翔!一种OO语言如何实现多态,根据语言的不同方式也不同。但总体来说,必然需要定义某种数据结构,其中记录着每个运行时对象的相关信息(对象的类型只是其中之一)。每个对象在创建时都会同时生成该结构的实例并且用对象的相关信息填充其中的字段。这样一来,只需查询该结构就可以获得对象信息了。这是语言实现层面的东西,与我们程序员无关,我们只需要知道OO语言提供了这种功能就好。下面再来谈谈打印机和print()的问题。我想Output类必然具有以下结构:Printerprinter=a_printer_instance;voidoutput(content){printer.print(content);}其中,实际的打印机对象a_printer_instance是在运行时创建的,虽然创建方式可能不同(直接创建、通过工厂、反射、外部注入等等),但可以肯定的是,Output对象所拿到的是一个实实在在的打印机对象,是3种打印机类型之一。而且前面说过,只要存在一个对象,OO语言就能够获得它的运行时类型。所以等到执行output()方法中的打印语句时,必然可以找到正确的print()方法实现,进而正确打印出内容来。仅就多态这一点来说,实现起来并不复杂。用C也可以很容易地实现(使用函数指针)。OO比面向过程更先进的地方体现在它同时实现了抽象、封装、多态三种特性,从而简化了软件开发过程。不知不觉写了一大段,到此住笔吧~共勉~
精慕HU
TA贡献1845条经验 获得超8个赞
我估计你理解歪了p的具体类型在运行时由系统确定不是说系统运行起来后,里面有个啥机制帮你确定p的具体类型实际上就是写代码调用Output()方法时自己决定,调用这个方法时,传递的p参数对象,是一个实现了Printer接口的类实例就行了
添加回答
举报
0/150
提交
取消