一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。
C# interface:定义接口
无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用“:”来表示。
接口定义的语法形式如下。
interface 接口名称
{
接口成员;
}
其中:
- 接口名称
通常是以 I 开头,再加上其他的单词构成。例如创建一个计算的接口,可以命名为 ICompute。 - 接口成员
接口中定义的成员与类中定义的成员类似。
接口中定义的成员必须满足以下要求。
• 接口中的成员不允许使用 public、private、protected、internal 访问修饰符。
• 接口中的成员不允许使用 static、virtual、abstract、sealed 修饰符。
• 在接口中不能定义字段。
• 在接口中定义的方法不能包含方法体。
【实例】创建一个接口计算学生成绩的接口 ICompute,并在接口中分别定义计算总成绩、平均成绩的方法。
//根据题目要求,在该接口中定义学生的学号、姓名的属性,并定义计算成绩的总分 和 平均分的方法。
interface ICompute
{
int Id {
get; set; }
string Name {
get; set; }
void Total();
void Avg();
}
通过上面的代码即可完成一个接口的定义,但是由于接口中的方法并没有具体的内容,直接调用接口中的方法没有任何意义。
在 C# 语言中规定不能直接创建接口的实例,只能通过类实现接口中的方法。
C#实现接口的两种方式:显示实现和隐式实现接口
接口的实现实际上和类之间的继承是一样的,也是重写了接口中的方法,让其有了具体的实现内容。
但需要注意的是,在类中实现一个接口时必须将接口中的所有成员都实现,否则该类必须声明为抽象类,并将接口中未实现的成员以抽象方式实现。
在 C# 语言中实现接口的具体语法形式如下。
class 类名 : 接口名
{
//类中的成员以及实现接口中的成员
}
以抽象方式实现接口中的成员是指将接口中未实现的成员定义为抽象成员,示例代码如下。
interface ITest
{
string name {
get; set}
void Print();
}
abstract class Test : ITest
{
public abstract string name {
get; set; }
public abstract void Print();
}
从上面的代码可以看出,在实现类 Test 中将未实现的属性和方法分别定义为抽象属性和抽象方法,并将实现类定义为抽象类。
这是一种特殊的实现方式,在实际应用中通常是将接口中的所有成员全部实现。
在实现接口的成员时有两种方式,一种是隐式实现接口成员,一种是显式实现接口成员。
在实际应用中隐式实现接口的方式比较常用,由于在接口中定义的成员默认是 public 类型的,隐式实现接口成员是将接口的所有成员以 public 访问修饰符修饰。
显式实现接口是指在实现接口时所实现的成员名称前含有接口名称作为前缀。
需要注意的是使用显式实现接口的成员不能再使用修饰符修饰,即 public、abstract、virtual、 override 等。
【实例】将上一节《C#接口定义》中定义的接口分别使用隐式和显式方式实现。
//使用隐式方式来实现接口 ICompute 的成员,以计算机专业的学生类 (ComputerMajor) 实现 ICompute 接口,
//为其添加英语 (English)、编程 (Programming)、数据库 (Database) 学科成绩属性,代码如下。
class ComputerMajor : ICompute
{
public int Id {
get; set; } //隐式的实现接口中的属性
public string Name {
get; set; } //隐式实现接口中的属性
public double English {
get; set; }
public double Programming {
get; set; }
public double Database {
get; set; }
public void Avg() //隐式实现接口中的方法
{
double avg = (English + Programming + Database) / 3;
Console.