开发者社区> 金色海洋> 正文

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

简介:     作者用了很大的篇幅讲解了一个程序,就是一个伪代码形式的,根据文件的扩展名打开文件的程序。比如要打开.doc的文件,那么就执行 OpenDocFile()函数。其他类型的文件也是类似的方法,一种扩展名对应一个函数。
+关注继续查看

   

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

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

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

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

 

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

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

 

 

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

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

 

 

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

 

<script >
        
function Opendoc()
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
{
            alert(
"打开了word文件");
        }

        
function Opengif()
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
{
            alert(
"打开了gif图片");
        }

        
        
function myClick()
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
{
            
var txt = document.getElementById("txtFile");
            
try
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                eval(
"Open"+ txt.value + "()");
            }

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
catch(e){
                alert(
"不能识别的扩展名");    
            }

        }

    
</script>
<body>
    
<input id="txtFile" type="text" /><input type="button" value="打开" onclick="myClick()" />
 
</body>
 

 


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

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

 

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

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

 

 

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
insert导致的性能问题大排查(r11笔记第26天)
今天开发的同学小窗口消息给我,向我咨询一个ORA错误的问题。 错误代码是ORA-30036,使用oerr ora 30036查看,由于是undo空间无法扩展导致。
1053 0
《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术
    作者用了很大的篇幅讲解了一个程序,就是一个伪代码形式的,根据文件的扩展名打开文件的程序。比如要打开.doc的文件,那么就执行 OpenDocFile()函数。其他类型的文件也是类似的方法,一种扩展名对应一个函数。
774 0
《你必须知道的.net》读书笔记 001——1.1 对象的旅行
    好久没看书了,上次看书的时候还是一年前了,一个偶然的机会,比较系统的看了一下OO的基础,封装、继承、多态等,当时真的是很不会,看了也是一知半解,迷迷糊糊的。在实际中的项目里也没敢一下子应用OO,还是用自己比较拿手的面向过程来应对项目,然后一点一点使用OO的技巧来代替一部分的代码(或者叫做功能)。
801 0
Oracle 12c中JOB运行失败的简单处理(r11笔记第66天)
在之前简单分析过一个12c中数据字典的小问题。 Oracle 12c数据字典的小问题(r11笔记第49天) 最近查看邮件,12c的一个PDB还是存在JOB运行异常的情况,因为是测试环境,不是业务类的JOB,这个问题就给了我一些时间来修复。
1342 0
《你必须知道的.net》读书笔记 005——1.5 玩转接口
     接口,理解这个东东用了好长的时间,从 2004年开始,写分页控件的时候需要实现一个接口,在网上找了一个例子,照猫画虎般的弄出来了,居然能用,但是完全没有理解何为接口。有好几年的时间过去了,直到最近才算是真正的理解了一点接口。
832 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20883 0
+关注
金色海洋
算法相关技术专家
323
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载