C# 接口

C# 接口

在现实生活中,常常需要一些规范和标准,如汽车轮胎坏了,只需更换一个同样规格的轮胎,计算机的硬盘要升级,只需买一个有同样接口和尺寸的硬盘进行更换,而一个支持USB接口的设备如移动硬盘、MP3、手机等都可以插入计算机的USB接口进行数据传输,这些都是因为有一个统一的规范和标准,轮胎、硬盘和USB才可以互相替换或连接。在软件开发领域,也可以通过定义一个接口来规定一系列规范和标准,继承同一接口的程序也就遵循同一种规范,这样程序可以互相替换,便于程序的扩展。

接口(interface)是C#的一种数据类型,属于引用类型。一个接口定义一个协定。接口可以包含方法、属性等成员,它只描述这些成员的签名(即成员的数据类型、名称和参数等),不提供任何实现代码,具体实现由继承该接口的类来实现。实现某个接口的类必须遵守该接口定义的协定,即必须按接口所规定的签名格式进行实现,不能修改签名格式。

接口的声明

在 c# 中,声明接口使用 interface 关键字,一般形式如下 :

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

其中,访问修饰符只能使用 publicinternal ,默认为 public ,可以省略 ;

接口名的命名规则与类名的命名规则相同,为了与类相区别,建议使用大写字母 I 打头。接口可以继承其他接口,基接口列表表示其继承的接口名。

接口成员可以是属性、方法等,不能包含常量、字段、构造函数和析构函数。所有接口成员隐式地具有了 public 访问修饰符,因此,不能为接口成员添加任何访问修饰符。

例如 :

interface IUsb(){
    int MaxSpeed {get;}
    string TransData(string from, string to);
}

上述代码定义了一个名为 IUsb的接口,它规定了只读属性 MaxSpeed和方法成员TransData 的签名格式。

接口的实现

接口主要用来定义一个规则,让企业内部或行业内部的软件开发人员按标准去实现应用程序的功能。在C#中,一个接口的派生类必须实现该接口声明的所有成员。

例如,派生类 Mp3从接口 IUsb派生,它实现该接口的所有成员,代码如下:

public class Mp3 : IUsb{
    public int MaxSpeed{
        get{
            return 480;
        }
    }
    public string TransData(string from, string to){
        return string.Format("数据传输: 从{0}到{1}",from,to);    
    }
}

在上述代码中,Mp3类实现了IUsb接口规定的 TransData 方法和 MaxSpeed属性,而如果删除TransData方法的实现,编译时将出现“Mp3不实现接口成员 IUsb. TransData(string, string)”的错误。

在C#中,结构型也可从接口派生。例如,将上述代码中 Mp3前面的 class 修改为struct也是正确的。不过,请读者注意结构型和类的区别。在C#中,结构型属于值类型,它不具备面向对象的特性,从继承性的角度来看,仅限于从接口派生,无法从一个结构型派生一个新的结构型。相反,类属于引用类型,完全体现面向对象的思想。因此,在使用C#开发应用软件时尽量使用类,而不使用结构型。

接口的继承性

在C#中,接口本身也支持继承性,也就是说可以从一个接口派生新的接口。与类的继承性不同,类只支持单一继承,而接口支持多重继承,即一个接口可以从多个基接口派生,基接口名之间用逗号分隔。

例如,

interface IUsb{
    int MaxSpeed{ get;}
    string TransData(string from, string to);
}

interface IBluetooth{
    int MaxSpeed{ get;}
    string TransData(string from, string to);
}


interface IMp3 : IUsb, IBluetooth{
    string play(string mp3);
}

本例中的IMp3接口继承了IUsb和IBluetooth两个接口,同时还添加了一个新的方法成员。这样,IMp3接口支持 Usb数据传送,也支持Bluetooth数据传送,还支持mp3播放。

多重接口实现

C#不允许多重类继承,但是C#允许多重接口实现,这意味着一个类可以实现多个接口,即一个类可以从多个基接口派生,各基接口之间用逗号分隔。

例如,

public class Mobile : IUsb, IBluetooth
{
    // 其它代码
}

就表示 Mobile 类同时实现 IUsb和IBluetooth 接口.因此既支持USB功能,也支持Bluetooth功能。

C#允许类同时从基类和基接口派生,但要求类名必须位于基接口名的前面。
例如,

public class Mobile : Phone, IUsb, IBluetooth
{
    // 其他代码
}

表示 Mobile类既是从phone基类派生的类,也是实现了IUsb和IBluetooth接口的派生类。再次强调,基类必须在所有的接口之前。
当类继承的多个接口中存在同名的成员时,在实现时为了区分是从哪个接口继承来的,C#使用“接口名称.接口成员”格式书写代码(称为显式实现)。显式实现的成员不能带任何访问修饰符,也不能通过类的实例来引用或调用,必须通过所属的接口来引用或调用。

例如,上例中的IUsb和IBluetooth 有同名的 TransData方法和MaxSpeed属性,为区分必须显式实现,代码如下:

public abstract class Phone{ // 抽象基类
    public abstract string Call(string name); // 抽象方法
}
public class Mobile : Phone, IUsb, IBluetooth{ // 派生类
    int IUsb.MaxSpeed{
        get{
            return 480;
        }
    }
    string IUsb.TransData(string from, string to){
        return string.Format("USB 数据传输: 从{0}到{1}",from,to);
    }
    int IBluetooth.MaxSpeed{
        get{
            return 64;
        }
    }
    string IBluetooth.TransData(string from, string to){
        return string.Format("蓝牙数据传输: 从{0}到{1}",from,to);
    }
    public override string Call(string name){
        return string.Format("正在同{0}通话中...", name);
    }    
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值