• 初识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();//写代码
            }
        }

    这样的如果再有程序员添加进来的话,我们只需把它们相关的类加进来,然后在main()中稍做修改就OK了。扩充性特别好!

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

    该文纯粹属于个人学习,有不足之处请多多指教!(文章部分内容摘自网络,如果侵犯您的权益,请及时联系我,谢谢。)

  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/xiangyisheng/p/6156170.html
Copyright © 2020-2023  润新知