- 接口与class类似,但是它只为其成员提供了规格,而没有提供具体的实现
- 接口的成员都是隐式抽象的
- 一个class或者struct可以实现多个接口
public interface IEnumerator
{
bool MoveNext();
object Current {get;}
void Reset();
}
- 接口的成员都是隐式public的,不可以声明访问修饰符
- 实现接口对它的所有成员进行public的实现
internal class Countdown: IEnumerator
{
int count = 11;
public bool MoveNext() => count -- >0;
public object Current => count;
pubilc void Reset() { throw new NotSupportedException(); }
}
- 可以隐式的把一个对象转化成它实现的接口
IEnumerator e = new Countdown();
while (e.MoveNext())
Console.Write(e.Current);
- 虽然Countdown是一个internal的class,但是可以通过把它的实例转化成IEnumerate 接口来公共的访问它的成员
- 接口可以继承别的接口
virtual的实现接口成员
- 隐式实现的接口成员默认是sealed的
- 如果想要进行重写的话,必须在基类中把成员标记为virtual或者abstract
public interface IUndoable { void Undo();}
public class TextBox: IUndoable
{
public virtual void Undo () => Console.WriteLine("TextBox.Undo");
}
public class RichTextBox: TextBox
{
public override void Undo() => Console.WriteLine("RichTextBox.Undo");
}
- 无论是转化为基类还是转化为接口来调用接口的成员,调用的都是子类的实现:
RichTextBox r = new RichTextBox();
r.Undo(); //RichTextBox.Undo
(IUndoable)r).Undo(); //RichTextBox.Undo
((TextBox)r).Undo(); //RichTextBox.Undo
显示实现的接口成员不可以被标记为virtual,也不可以通过寻常的方式重写,但是可以对其进行重新实现
网友评论