c#初学-接口interface的使用

接口使用 interface 关键字进行定义,如下面的示例所示:

interface IEquatable<T>
{
bool Equals(T obj);
}

接口描述的是可属于任何结构的一组相关功能。接口可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。接口不能包含字段。接口成员一定是公共的。

当类或结构继承接口时,意味着该类或结构为该接口定义的所有成员提供实现。接口本身不提供类或结构能够以继承基类功能的方式继承的任何功能。但是,如果基类实现接口,派生类将继承该实现。

类和结构可以按照类继承基类或结构的类似方式继承接口,但有两个例外:

  • 类或结构可继承多个接口。

  • 类或结构继承接口时,仅继承方法名称和签名,因为接口本身不包含实现。例如:

    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 访问器的属性,而实现该接口的类可以声明同时带有 getset 访问器的同一属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。

接口和接口成员是抽象的;接口不提供默认实现。有关更多信息,请参见抽象类、密封类和类成员

IEquatable(Of T) 接口向对象的用户宣布该对象可以确定其是否与同一类型的其他对象相等,而接口的用户不需要知道相关的实现方式。

接口可以继承其他接口。类可以通过其继承的基类或接口多次继承某个接口。在这种情况下,如果将该接口声明为新类的一部分,则该类只能实现该接口一次。如果没有将继承的接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员;在这种情况下,继承接口的类可通过重写虚拟成员来更改接口行为。有关虚拟成员的更多信息,请参见多态性

接口具有下列属性:

  • 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

  • 不能直接实例化接口。

  • 接口可以包含事件、索引器、方法和属性。

  • 接口不包含方法的实现。

  • 类和结构可从多个接口继承。

  • 接口自身可从多个接口继承。

显式接口实现(C# 编程指南)

解释如何创建特定于接口的类成员。

如何:显式实现接口成员(C# 编程指南)

提供一个有关如何显式实现接口成员的示例。

如何:使用继承显式实现接口成员(C# 编程指南)

提供一个有关如何通过继承显式实现接口成员的示例。

接口属性(C# 编程指南)

解释如何声明接口上的属性。

接口中的索引器(C# 编程指南)

解释如何声明接口上的索引器。

如何:实现接口事件(C# 编程指南)

演示接口如何声明事件。

类和结构(C# 编程指南)

描述 C# 如何使用对象、类和结构。

显示接口的实现:

如果实现两个接口,并且这两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为它们的实现。例如:

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 使用。两个方法实现都是分离的,都不可以直接在类中使用。例如:


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.

显式实现还用于解决两个接口分别声明具有相同名称的不同成员(如属性和方法)的情况:
 
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; } }
}
 
显示实现接口成员:

本示例声明一个 接口 IDimensions 和一个类 Box,该类显式实现接口成员 getLengthgetWidth。通过接口实例 dimensions 访问这些成员。

  • interface IDimensions
    {
    float getLength();
    float getWidth();
    }

    class Box : IDimensions
    {
    float lengthInches;
    float widthInches;

    Box(float length, float width)
    {
    lengthInches = length;
    widthInches = width;
    }
    // Explicit interface member implementation:
    float IDimensions.getLength()
    {
    return lengthInches;
    }
    // Explicit interface member implementation:
    float IDimensions.getWidth()
    {
    return widthInches;
    }

    static void Main()
    {
    // Declare a class instance box1:
    Box box1 = new Box(30.0f, 20.0f);

    // Declare an interface instance dimensions:
    IDimensions dimensions = (IDimensions)box1;

    // The following commented lines would produce compilation
    // errors because they try to access an explicitly implemented
    // interface member from a class instance:
    //System.Console.WriteLine("Length: {0}", box1.getlength());
    //System.Console.WriteLine("Width: {0}", box1.getwidth());

    // Print out the dimensions of the box by calling the methods
    // from an instance of the interface:
    System.Console.WriteLine("Length: {0}", dimensions.getLength());
    System.Console.WriteLine("Width: {0}", dimensions.getWidth());
    }
    }
    /* Output:
    Length: 30
    Width: 20
    */

     

    请注意 Main 方法中下列代码行被注释掉,因为它们将产生编译错误。显式实现的接口成员不能从实例访问:

    //System.Console.WriteLine("Length: {0}", box1.getlength());
    //System.Console.WriteLine("Width: {0}", box1.getwidth());


    还请注意, Main 方法中的下列代码行成功输出框的尺寸,因为这些方法是从接口实例调用的:
  • System.Console.WriteLine("Length: {0}", dimensions.getLength());
    System.Console.WriteLine("Width: {0}", dimensions.getWidth());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值