C#中的接口:
接口成员的定义与类成员的定义相似,但有以下区别:
(1)不允许使用访问修饰符(public,private,protected,或internal),所有接口成员都隐式的是公共的。
(2)接口成员不能包含代码体,即不能实现方法或属性的访问器。
(3)接口不能定义字段成员。
(4)不能用关键字static,virtual,abstract或sealed来定义接口成员。
(5)……
在类中实现接口:
public interface IMyInterface
{
void DoSomething();
void DoSomethingElse();
}
实现接口的类必须包含该接口所有成员的实现代码,且必须匹配指定的签名(包括匹配指定的get和set块),并且必须是公共的。
public class MyClass : IMyInterface
{
public void DoSomething()
{
}
public void DoSomethingElse()
{
}
}
可使用关键字virtual或abstract来实现接口成员,不能使用static或const。可以在基类上实现接口成员:
public class MyBaseClass
{
public void DoSomething()
{
}
}
public class MyClass : MyBaseClass, IMyInterface
{
public void DoSomethingElse()
{
}
}
实现类中使用virtual和override重写基类成员和使用new关键字隐藏基类成员的区别和类中隐藏基类成员相似。
可以显示的实现接口成员,这样就只能通过接口来访问该成员,不能通过类来访问。如下:
public class MyClass : IMyInterface
void IMyInterface.DoSomething()
{
}
public void DoSomethingElse()
{
}
}
访问时:
MyClass mc = new MyClass();
IMyInterface imi = mc;
imi.DoSomething();
mc.DoSomethingElse();
接口中的属性存储器:
ublic interface IMyInterface
{
int MyIntProperty
{
get;
}
}
实现带属性的接口时,必须实现接口中属性的get或/和set存储器。如果只包含set块,则可以给类中的属性添加get块,反之亦然,但只有隐式实现接口时才能这么做。
另外,添加的存取器的可访问修饰符要比接口中定义的存取器的可访问修饰符更严格。因为接口定义的存取器是公共的,所以只能添加非公共的存取器。如果新添加的
存取器是公共的,那么能够访问实现该接口的类的代码也可以访问该存取器,但是,只能访问接口的代码就无法访问该存取器。
public class MyClass : IMyInterface
{
public int MyIntProperty
{
get;
protected set;
}
}