C# 接口
C#接口
接口提供了一个规范而不是其成员的实现。
接口作为定义和实现之间的联系。
接口成员都是隐式抽象的。
类或结构可以实现多个接口。
接口声明就像一个类声明,但它不为其成员提供实现。
这些成员将由实现接口的类和结构实现。
接口只能包含方法,属性,事件和索引器。
例子
下面是在System.Collections中定义的IEnumerator接口的定义:
public interface IEnumerator {
bool MoveNext();
object Current { get; }
void Reset();
}
接口成员总是隐式公开的,不能声明访问修饰符。
实现接口意味着为其所有成员提供公共实现:
class Countdown : IEnumerator {
int count = 11;
public bool MoveNext () {
return count-- > 0 ;
}
public object Current {
get {
return count;
}
}
public void Reset() {
throw new NotSupportedException();
}
}
您可以将对象隐式转换为它实现的任何接口。例如:
IEnumerator e = new Countdown(); while (e.MoveNext()) Console.Write (e.Current);
扩展接口
接口可以从其他接口派生。
例如:
public interface IUndoable {
void Undo();
}
public interface IRedoable : IUndoable {
void Redo();
}
IRedoable “继承" IUndoable 的所有成员。
显式接口实现
实现多个接口有时可能导致成员方法之间的冲突。
我们可以通过显式实现一个接口成员来解决这种冲突。
考虑下面的例子:
interface Interface1 {
void iMethod();
}
interface Interface2 {
int iMethod();
}
public class Widget : Interface1, Interface2 {
public void iMethod () {
Console.WriteLine ("Widget"s implementation of Interface1.iMethod");
}
int Interface2.iMethod(){
Console.WriteLine ("Widget"s implementation of Interface2.iMethod");
return 42;
}
}
这使得两种方法在一个类中共存。调用显式实现的成员的唯一方法是转换到其接口:
Widget w = new Widget(); w.iMethod(); // Widget"s implementation of Interface1.iMethod ((Interface1)w).iMethod(); // Widget"s implementation of Interface1.iMethod ((Interface2)w).iMethod(); // Widget"s implementation of Interface2.iMethod
实质上实现接口成员
隐式实现的接口成员默认是封装的。
它必须在基类中标记为virtualor或abstract以便被覆盖。
例如:
public interface IUndoable {
void Undo();
}
public class DrawPad : IUndoable {
public virtual void Undo() {
Console.WriteLine ("DrawPad.Undo");
}
}
public class RichDrawPad : DrawPad {
public override void Undo() {
Console.WriteLine ("RichDrawPad.Undo");
}
}