《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术


   

作者用了很大的篇幅讲解了一个程序,就是一个伪代码形式的,根据文件的扩展名打开文件的程序。比如要打开.doc的文件,那么就执行 OpenDocFile()函数。其他类型的文件也是类似的方法,一种扩展名对应一个函数。调用的时候就是用Case来判断扩展名,然后调用对应的函数。

然后呢提出了这种实现方法的一些缺点,这里就不描述了。我觉得最重要的两个缺点是扁平化和case的方式调用。

扁平化,OpenDocFile()这样的函数都是同一个层次的,没有所属关系,现在电脑里的扩展名也实在是太多了,几百个函数堆砌在一起,实在是难以维护。

case调用,看起来挺简单的,也很容易理解,但是扩展名多了就是噩梦了,真的达到了几百个的话,那带码得写多长呀?

 

作者下面的讲解就是围绕这两个部分来进行的(我感觉的)。首先定一个IFileOpen的接口(不明白为什么要定义这个,这一节讲的是多态呀),接口里面定义一个OpenFile()函数。然后定义一个抽象基类,Files:IFileOpen 。然后又定义了几个基类,打开文档的,打开图片的,打开视频的,在下面就是具体的实现类了。这样函数就有了归属,有了层次感。我觉得对于这个例子来说,好像没有必要定义那个接口呀。

然后是调用,作者采用了先把打开每一种文件的类的实例加载到一个集合里面,然后再用循环(foreach)的方式遍历,如果扩展名相同的话,那么就调用这个实例的OpenFile函数。

 

 

看了这个例子,想起来了我写的表单控件,所有的实现带码都放在一个类里面,就是那个表单控件。表单控件要加载的子控件越来越多,然后代码就越来越臃肿,越来越难以维护。所以新的表单控件打算采用接口的方式,把实现代码分到各个子控件里面去,这样带码就分散开了。

新的分页控件(QuickPager)就采用了组合+多态的方式,实现了多种分页算法并存和灵活调用。

 

 

C#的限制。如果换成js语言又会是什么样子呢?

 

《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术<script >
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
function Opendoc()
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术{
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            alert(
"打开了word文件");
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        }

《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
function Opengif()
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术{
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            alert(
"打开了gif图片");
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        }

《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
function myClick()
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术{
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            
var txt = document.getElementById("txtFile");
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            
try
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术{
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术                eval(
"Open"+ txt.value + "()");
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            }

《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            
catch(e)《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术{
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术                alert(
"不能识别的扩展名");    
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术            }

《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术        }

《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术    
</script>
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术
<body>
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术    
<input id="txtFile" type="text" /><input type="button" value="打开" onclick="myClick()" />
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术 
</body>
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术
 

 


    这样至少在调用的时候可以非常的简单,当然我不知道eval到底做了些什么,但是至少写起来很简单。

我对于js也不太了解,只会写个function和eval,所以如果有一个大堆的function的时候,我也不知道要如何处理才能更好的管理。

 

多态的分类
第一种:强制的、重载的、参数的和包含的。
第二种:基类继承式多态,接口是现实多态。

“继承和重载是多态的实现基础”。

 

 

上面的js脚本的演示,可以运行的。

上一篇:手把手教你搭建和配置Jenkins环境


下一篇:MySQL必知必会笔记<2>