C#程序设计自学经典
上QQ阅读APP看书,第一时间看更新

5.3 接口

接口是为了实现多重继承而产生的。由于C#中的类不支持多重继承,但在客观世界中出现多重继承的情况又比较多,因此为了避免传统的多重继承给程序带来的复杂性等问题,同时又保证了多重继承带给程序员的诸多好处,因此接口显得尤为重要。本节将对接口进行详细的讲解。

5.3.1 接口的介绍及声明

在C#中使用interface声明接口,其语法格式如下:

    访问修饰符 interface 接口名
    {
        //接口成员
    }

在声明接口时,除interface关键字和接口名外,其他的都是可选的。可以使用public、protected、private、new和internal等修饰符声明接口,但接口成员必须是public的。

接口可包含方法、属性、事件或索引器这4种成员类型,但不能包含字段,也不能设置这些成员的具体值,即只能定义,不能赋值。

所以,接口具有以下特性。

(1)不能直接实例化接口。

(2)接口可以包含方法、属性、事件或索引器。

(3)接口不包含方法的实现。

(4)继承接口的任何非抽象类型都必须实现接口的所有成员。

(5)类和结构以及接口本身都可以从多个接口继承。

接口成员的定义与类成员相似,但需要注意以下几点区别。

(1)接口成员不能包含代码体。

(2)接口成员不能用关键字static、abstract、virtual或sealed来定义。

(3)接口不能包含类型定义。

以下代码片段声明了一个public的名为IMyInterface的接口,并定义了一个名为ShowMsg的方法。

    public interface IMyInterface
    {
        void ShowMsg();
    }

5.3.2 实现接口

接口通过类的继承来实现,一个类虽然只能有一个基类,但可以继承任意多个接口,实现接口的类必须包含该接口所有成员的实现代码,同时必须匹配指定的签名,并且必须是public的。

例5-8演示了接口的实现。

例5-8:接口的实现(ConsoleInterface)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleInterface
    {
        class Program
        {
            static void Main(string[] args)
            {
                IPerson iPerson = new Chinese();
                iPerson.Say();
                iPerson = new American();
                iPerson.Say();
                Console.ReadLine();
            }
        }
    
        public interface IPerson
        {
            void Say();
        }
    
        public class Chinese : IPerson
        {
            public void Say()
            {
                Console.WriteLine("你好!");
            }
        }
    
        public class American : IPerson
        {
            public void Say()
            {
                Console.WriteLine("Hello!");
            }
        }
    } 

运行结果如图5-8所示。

图5-8 接口的实现

在此例中,声明了一个名为IPerson的接口,IPerson接口中有一个Say方法。接着定义了Chinese和American两个类,并分别实现了IPerson接口,并实现了Say方法。在Main方法中,分别使用两个类的对象实例化IPerson接口,并分别调用其Say方法输出相应信息。