• C#中接口的理解


    接口的相关陈述
    1.一个接口定义了一个契约。
    2.接口可以包容方法、C#属性、事件、以及索引器。
    3.在一个接口声明中,我们可以声明零个或者多个成员。
    4.所有接口成员的默认访问类型都是public。
    5.如果在接口成员声明中包括了任何修饰符,那么会产生一个编译器错误。
    6.与一个非抽象类类似,一个抽象类必须提供接口中所有成员的实现,只要这些成员在这个类的基类中出现过。
     
    接口的理解
    1.        面向接口编程利用OO的一个基本性质——多态,相同方法不同表现。可以这样想一下,client编写自己程序的时候,如果直接面向一个具体类写程序,那这个程序有个风吹草动的,那client就要受到影响,但如果面向一个接口就不同了,某个具体类变了,只知接口,不知具体类的client就可以完全不动。都说上层领导比较好当,因为可以干的事通常对老百姓来说是虚的,越虚就越不容易错。
    这个道理在OO中也是适用的。
    2.       换个视角看,面向接口编程反映OO的另一个方面——封装,接口将具体实现封装了起来,可以不影响客户的情况下切换实现
    3.       接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。

    假设我们公司有两种程序员:VB程序员,指的是用VB写程序的程序员,用clsVBProgramer这个类表示;Delphi程序员指的是用Delphi写程序的程序员,用clsDelphiProgramer这个类来表示。 每个类都有一个WriteCode()方法。定义如下:

    class clsVBProgramer()
    {
       ....
       WriteCode()
       {
          //用VB语言写代码;
       }
       ....
    }

    class clsDelphiProgramer()
    {
       ....
       WriteCode()
       {
         //用Delphi语言写代码;
       }
        ....
    }

    现在公司来了一个项目,要求派某个程序员写一个程序。
    class clsProject()
    {
       ....
       WritePrograme(clsVBProgramer programer)//用VB写代码
       {
         programer.WriteCode();
       }
       WritePrograme(clsDelphiProgramer programer)//重载方法,用Delphi写代码
       {
         programer.WriteCode();
       }
    ......
    }
    在主程序中我们可以这样写:
    main()
    {
        clsProject proj=new   clsProject;
        //如果需要用VB写代码
        clsVBProgramer programer1=new clsVBProgramer;
        proj.WritePrograme(programer1);
        //如果需要用Delphi写代码
        clsDelphiProgramer programer2=new clsDelphiProgramer;
        proj.WritePrograme(programer2);
    }

    但是如果这时公司又来了一个C#程序员,我们怎么改这段程序,使它能够实现用C#写程序的功能呢?我们需要增加一个新类clsCSharpProgramer,同时在此clsProject这个类中要再次重载WritePrograme(clsCSharpProgramer programer)方法。这下麻烦多了。如果还有C程序员,C++程序员,JAVA程序员呢。麻烦大了!

    但是如果改用接口,就完全不一样了:
    首先声明一个程序员接口:
    interface IProgramer()
    {
       WriteCode();
    }
    然后声明两个类,并实现IProgramer接口:
    class clsVBProgramer():IProgramer
    {
       ....
       WriteCode()
       {
          //用VB语言写代码;
       }
       ....
    }

    class clsDelphiProgramer():IProgramer
    {
       ....
       WriteCode()
       {
         //用Delphi语言写代码;
       }
        ....
    }
    对clsProject这个类进行一下修改:
    class clsProject()
    {
       ....
       WritePrograme(IProgramer programer)
       {
         programer.WriteCode();//写代码
       }
       ......
    }

    main()
    {
        clsProject proj=new   clsProject;
        IProgramer programer;
        //如果需要用VB写代码
        programer=new clsVBProgramer;
        proj.WritePrograme(programer);
        //如果需要用Delphi写代码
        programer=new clsDelphiProgramer;
        proj.WritePrograme(programer);    
    }
    如果再有C#,C,C++,JAVA这样的程序员添加进来的话,我们只需把它们相关的类加进来,然后在main()中稍做修改就OK了。扩充性特别好!

    另外我们如果把clsProject这个类封成一个组件,那么当我们的用户需要要扩充功能的时候,我们只需要在外部做很小的修改就能实现,可以说根本就用不着改动我们已经封好组件!是不是很方便,很强大!

  • 相关阅读:
    绪论-1.1.2机器学习
    Django从 URL获取参数的几种方式
    conda创建虚拟换件安装包时报错“无法定位程序输入点OPENSSL_sk_new_reserve于动态链接库C:Users...libssl-1_1-x64.dll”
    执行python manage.py makemigrations出错
    Linux下conda虚拟环境
    云服务器安装mysql
    2020牛客暑期多校训练营(第五场)
    2020牛客暑期多校训练营(第四场)
    2020牛客暑期多校训练营(第三场)
    All with Pairs
  • 原文地址:https://www.cnblogs.com/engine1984/p/1024277.html
Copyright © 2020-2023  润新知