C#学习之interface

来源:互联网 发布:新纪元取数软件 编辑:程序博客网 时间:2024/06/06 01:17
接口描述的是可属于任何类或结构的一组相关功能。接口可由方法、属性、事件、索引器中的任意组合构成。接口不包含字段。接口成员一定是公共的。当类或结构继承接口时,意味着该类或结构为该接口定义的所有成员提供实现。接口本身不提供类或结构能够以继承基类功能的方式继承的任何功能。但是,如果基类实现接口,派生类将继承该实现。类和结构可以按照类继承基类或结构的类似方式继承接口,但有两个例外:
  • 类或结构可继承多个接口。
  • 类或结构继承接口时,仅继承方法名称和签名,因为接口本身不包含实现。例如:
public class Car : IEquatable<Car>{    public string Make {get; set;}    public string Model { get; set; }    public string Year { get; set; }    // Implementation of IEquatable<T> interface    public bool Equals(Car car)    {        if (this.Make == car.Make &&            this.Model == car.Model &&            this.Year == car.Year)        {            return true;        }        else            return false;    }}

若要实现接口成员,类中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。类的属性和索引器可以为接口上定义的属性或索引器定义额外的访问器。例如,接口可以声明一个带有 get 访问器的属性,而实现该接口的类可以声明同时带有 get 和 set 访问器的同一属性。 但是,如果属性或索引器使用显式实现,则访问器必须匹配。接口和接口成员是抽象的;接口不提供默认实现。接口可以继承其他接口。类可以通过其继承的基类或接口多次继承某个接口。在这种情况下,如果将该接口声明为新类的一部分,则该类只能实现该接口一次。如果没有将继承的接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员;在这种情况下,继承接口的类可通过重写虚拟成员来更改接口行为。
接口具有下列属性:

  • 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
  • 不能直接实例化接口。
  • 接口可以包含事件、索引器、方法和属性。
  • 接口不包含方法的实现。
  • 类和结构可从多个接口继承。
  • 接口自身可从多个接口继承。
    以下介绍一个显示接口实现的实例:
interface IControl{    void Paint();}interface ISurface{    void Paint();}class SampleClass : IControl, ISurface{    // Both ISurface.Paint and IControl.Paint call this method.    public void Paint()    {    }}

然而,如果两个 接口成员执行不同的函数,那么这可能会导致其中一个接口的实现不正确或两个接口的实现都不正确。 可以显式地实现接口成员 – 即创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的。例如:

public class SampleClass : IControl, ISurface{    void IControl.Paint()    {        System.Console.WriteLine("IControl.Paint");    }    void ISurface.Paint()    {        System.Console.WriteLine("ISurface.Paint");    }}

类成员 IControl.Paint 只能通过 IControl 接口使用, ISurface.Paint 只能通过 ISurface 使用。以下是一个包含接口以上属性的例子:

using System;namespace test_2{        interface IControl     //接口部分        {            void Paint();        }        interface ISurface        {            void Paint();  //只有方法名,不包括方法的实现        }        public class SampleClass : IControl, ISurface //被类继承,但此时类似于抽象基类,无实现;类或是结构可从多个接口继承        {            void IControl.Paint()      //继承接口的任何非抽象类型都必须实现接口的所有成员            {                System.Console.WriteLine("IControl.Paint");            }            void ISurface.Paint()            {                System.Console.WriteLine("ISurface.Paint");            }            static void Main()            {                SampleClass obj = new SampleClass();                //obj.Paint();  // Compiler error.   //不能直接实例化接口                IControl c = (IControl)obj;                c.Paint();  // Calls IControl.Paint on SampleClass.                ISurface s = (ISurface)obj;                s.Paint(); // Calls ISurface.Paint on SampleClass.                Console.WriteLine("Press any key to exit.");                Console.ReadKey();            }        }}

明明Paint()方法是存在的,编译器为什么报错呢,因为这儿的 两个方法实现都是分离的,都不可以直接在类中使用。
显式实现还用于解决两个接口分别声明具有相同名称的不同成员(如属性和方法)的情况:

interface ILeft{    int P { get;}}interface IRight{    int P();}

为了同时实现两个接口,类必须对属性 P 和方法 P 使用显式实现以避免编译器错误。例如:
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}

0 0
原创粉丝点击