zoukankan      html  css  js  c++  java
  • C#接口

    初识C#接口

     

    C# 接口(Interface)

    接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。

    接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

    抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。

    接口是引用类型的,类似于类,和抽象类的相似之处有三点:
           1、不能实例化;
           2、包含未实现的方法声明;
           3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

           另外,接口有如下特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

    C#接口的作用 

    1.接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类《至少》要实现哪些功能,继承它的类可以增加自己的方法.

    2.使用接口可以使继承它的类: 命名统一/规范,易于维护.比如: 两个类 "狗"和"猫",如果它们都继承了接口"动物",其中动物里面有个方法Behavior(),那么狗和猫必须得实现Behavior()方法,并且都命名为Behavior这样就不会出现命名太杂乱的现象.如果命名不是Behavior(),接口会约束即不按接口约束命名编译不会通过.

    3.提供永远的接口。 当类增加时,现有接口方法能够满足继承类中的大多数方法,没必要重新给新类设计一组方法,也节省了代码,提高了开发效率

    声明接口

    接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。下面是一个接口声明的实例:

    复制代码
    //公共接口: "动物" 
    public interface IAnimal
     {
            void Behavior(); //行为方法,描述各种动物的特性 
    }
     
    //类: 狗 
    public class Dog : IAnimal
    {
            public void Behavior()
            {
                   //Console.Write("我晚上睡觉,白天活动");
                    MessageBox.Show("我晚上睡觉,白天活动");
             }
     }
     
    //类: 猫 
    public class Cat : IAnimal
    {
          public void Behavior()
          {
                    //Console.Write("我白天睡觉,晚上活动");
                    MessageBox.Show("我白天睡觉,晚上活动");
           }
     }
    //简单的应用: 
    public static Main() 
    { 
           Dog myDog = new Dog(); 
           myDog.Behavior(); //输出: "我晚上睡觉,白天活动" 
           Cat myCat = new Cat(); 
           myCat.Behavior(); //输出: "我白天睡觉,晚上活动" 
    }
    复制代码

    以上调用不同的类的相同名方法,会输出不同的东东,也就是说每个类里面的同名方法完成的功能可以是完全不同的.

    更进一步,不是用上面Main方法这样一个一个调用类的方法,用多态性实现其调用.

    看一下下面这个方法:

    public void Behavior(IAnimal myIanimal)
    {
                myIanimal.Behavior();
    }

    其参数是接口类型,任何继承它的类都可以调用此方法,此方法能根据类的不同调用不同的类 中的方法. 也即能够自己根据不同的类,完成不同的类的功能.

    多态性代码示例:

    Dog myDog = new Dog();
    Cat myCat = new Cat();
    Behavior(myDog); //Behavior接受“狗”类实例 
    Behavior(myCat); //Behavior接受“猫”类实例

    这样Behavior方法写一次就能完成所有继承它的类中的相同名方法的不同功能. 非常方便,同样,由于“动物软件”功能需求,需要再增加一个"龟"类:

    复制代码
    //类: 龟 
    public Tortoise: IAnimal 
    { 
           public void Behavior() 
           {
                      MessageBox.Show("我可以不活动,一睡就睡五千年!");
           } 
    }
    复制代码

    那么也可以调用上面多态方法,所以说接口使方法具有较好扩展性. 如果继承它的类很多的话,有多少好处是可想而知的!(出处:http://blog.csdn.net/yunhaic/article/details/6662843)

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

    复制代码
    public class clsVBProgramer
    {
        public void WriteCode()
        {
            //用VB语言写代码;
        }
    }
    
    public class clsDelphiProgramer
    {
        public void WriteCode()
        {
            //用Delphi语言写代码;
        }
    }
    
    public class clsProject
    {
        public void WritePrograme(clsVBProgramer programer)//用VB写代码
        {
            programer.WriteCode();
        }
        public void WritePrograme(clsDelphiProgramer programer)//重载方法,用Delphi写代码
        {
            programer.WriteCode();
        }
    }
    
    static void Main(string[] args)
    {
        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程序员呢。麻烦大了!

    但是如果改用接口,就完全不一样了:
    首先声明一个程序员接口:

    复制代码
        class Program
        {
            static void Main(string[] args)
            {
                clsProject proj = new clsProject();
                IProgramer programer;
                //如果需要用VB写代码
                programer = new clsVBProgramer();
                proj.WritePrograme(programer);
                //如果需要用Delphi写代码
                programer = new clsDelphiProgramer();
                proj.WritePrograme(programer);
    
            }
        }
        /// <summary>
        /// 声明接口
        /// </summary>
        public interface IProgramer
        {
            void WriteCode();
        }
        //然后声明类,并实现IProgramer接口:
        /// <summary>
        /// VB程序员实现的WriteCode方法
        /// </summary>
        public class clsVBProgramer : IProgramer
        {
            public void WriteCode()
            {
                //用VB语言写代码;
                Console.WriteLine("我是VB程序员实现的");
            }
        }
        /// <summary>
        /// Delphi程序员实现的WriteCode方法
        /// </summary>
        public class clsDelphiProgramer : IProgramer
        {
            public void WriteCode()
            {
                //用Delphi语言写代码;
                Console.WriteLine("我是Delphi程序员实现的");
            }
        }
        /// <summary>
        /// CSharp程序员实现的WriteCode方法
        /// </summary>
        public class clsCSharpProgramer : IProgramer
        {
            public void WriteCode()
            {
                //用Delphi语言写代码;
                Console.WriteLine("我是CSharp程序员实现的");
            }
        }
        /// <summary>
        /// 项目
        /// </summary>
        public class clsProject
        {
            public void WritePrograme(IProgramer programer)
            {
                programer.WriteCode();//写代码
            }
        }
    复制代码
  • 相关阅读:
    Git 基础
    SharePoint 2013 对象模型操作"网站设置"菜单
    SharePoint 2013 隐藏部分Ribbon菜单
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 设置自定义布局页
    SharePoint 2013 "通知我"功能简介
    SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
    SharePoint 禁用本地回环的两个方法
  • 原文地址:https://www.cnblogs.com/sun1512/p/6165598.html
Copyright © 2011-2022 走看看