接口
概述
- 接口是指定一组函数成员而不实现它们的引用类型,只能使用类和结构来实现接口.
- 接口可以有访问修饰符,接口成员不能有访问修饰符.
- 接口声明不能包含数据成员,静态成员.
- 只有类和结构才能实现接口.
接口声明
- 接口声明可以有任何的访问修饰符.接口成员不允许有任何访问修饰符,且默认是隐式 public 的.
public interface IMyInterface {
// 错误,接口成员不能有访问修饰符
private void PrintOut(string s);
}
接口实现
- 如果类实现了接口,必须实现接口的所有成员.
- 如果类派生自一个实现了接口的基类,基类必须放在所有接口之前,且只能有一个基类名称.
// 基类:BaseClass
// 接口:IIfc1,IEnumrable,IComparable
class Derived : BaseClass, IIfc1, IEnumrable, IComparable {
}
使用 IComparable 接口
IComparable 接口
- 内置类型实现了 IComparable 接口,可以直接使用.自定义类型需要实现 IComparable 接口.
接口实例
多个接口的引用
派生成员实现接口
using System;
interface IIfc1 {
void PrintOut(string s);
}
interface IIfc2 {
void PrintOut(string t);
}
class MyClass: IIfc1, IIfc2 {
public void PrintOut(string s) {
Console.WriteLine($"Calling through:{s}");
}
}
class Program {
static void Main() {
MyClass mc = new MyClass();
// 调用类对象的实现方法
mc.PrintOut("object");
// 类对象引用转化为接口类型引用
IIfc1 ifc1= (IIfc1)mc;
IIfc2 ifc2= (IIfc2)mc;
// 调用接口方法
ifc1.PrintOut("interface1");
ifc2.PrintOut("interface2");
}
}
using System;
interface IIfc1 {
void PrintOut(string s);
}
interface IIfc2 {
void PrintOut(string t);
}
class MyBaseClass {
public void PrintOut(string s) {
Console.WriteLine($"Calling through:{s}");
}
}
// 如果类派生自基类并实现了接口, 基类列表中的基类名称必须放在所有接口之前.
// 并且只能有一个基类,列出的其它类型必须为接口类型.
class Derived: MyBaseClass, IIfc1, IIfc2 {
}
class Program {
static void Main() {
Derived d = new Derived();
d.PrintOut("Object");
}
}