zoukankan      html  css  js  c++  java
  • 《你必须知道的.net》读书笔记 004 —— 1.4 多态的艺术


       

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

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

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

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

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

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

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

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

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

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

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

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

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

            }

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


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

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

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

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

     

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

  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/jyk/p/1246367.html
Copyright © 2011-2022 走看看