zoukankan      html  css  js  c++  java
  • c#接口作用的深入理解

    1、C#接口的作用 :

    C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识到接口的作用的时候就觉得用接口是多此一举,
    当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比盖茨还聪明的人,他们的C#能添这样的多足吗?!
    关于接口的作用,网上有一位就真的深入浅出给我们做了很好理解的分析。

    我们定义一个接口
    public interface IBark
    {
    void Bark();
    }
    再定义一个类,继承于IBark,并且必需实现其中的Bark()方法
    public class Dog:IBark
    {
    public Dog()
    {}
    public void Bark()
    {
    Consol.write("汪汪");
    }
    }
    然后,声明Dog的一个实例,并调用Bark()方法
    Dog 旺财=new Dog();
    旺财.Bark();
    试想一样,若是想调用Bark()方法,只需要在Dog()中声明这样的一个方法不就行了吗,干什么还要用接口呢.因为接口中并没有Bark()具体实现.真的实现还是要在Dog()中.那么使用接口不是多此一举吗?
    还有人是这样说的:从接口的定义方面来说,接口其实就是类和类之间的一种协定,一种约束.还拿上面的例子来说.所有继承了IBark接口的类中必需实现Bark()方法.那么从用户(使用类的用户)的角度来说,如果他知道了某个类是继承于IBark接口,
    那么他就可以放心大胆的调用Bark()方法,而不用管Bark()方法具体是如何实现的.比如,我们另外写了一个类.
    public class Cat:IBark
    {
    public Cat()
    {}
    public void Bark()
    {
    Consol.write("喵喵");
    }
    }
    当用户用到Cat类或是Dog类的时候,知道他们继承于IBark,那么不用管类里的具体实现,而就可以直接调用Bark()方法,因为这两个类中肯定有关于Bark()方法的具体实现.

    如果我们从设计的角度来看.一个项目中用若干个类需要去编写,由于这些类比较复杂,工作量比较大,这样每个类就需要占用一个工作人员进行编写.比如A程序员去定Dog类,B程序员去写Cat类.这两个类本来没什么联系的,可是由于用户需要他们
    都实现一个关于"叫"的方法.这就要对他们进行一种约束.让他们都继承于IBark接口,目的是方便统一管理.另一个是方便调用.
    当然了,不使用接口一样可以达到目的.只不过这样的话,这种约束就不那么明显,如果这样类还有Duck类等等,比较多的时候难免有人会漏掉这样方法.所以说还是通过接口更可靠一些,约束力更强一些.

    2、C#中接口的深入浅出:

    通过学习对C#中接口的作用有了更进一步的理解,拿出来跟大家分享一下,有说的不对的地方请大家指教。


    假设我们公司有两种程序员: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这个类封成一个组件,那么当我们的用户需要要扩充功能的时候,我们只需要在外部做很小的修改就能实现,可以说根本就用不着改动我们已经封好组件!是不是很方便,很强大!
  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/13597165.html
Copyright © 2011-2022 走看看