类可以看做是创建一组对象的模版,类似的接口可以看做创建一组类的模版。一个类可以实现多个接口,从而实现多重继承。接口使得服务协议与实现相分离,是组件编程的基础,是组件向外公布其功能的唯一方法。
接口的设计原则是:一旦发布一个接口就不能再更改它,但是可以通过继承扩展新的接口。
接口成员的特点(以下在学习中的总结):
1.接口成员都是public类型的,但是不能使用public修饰符。
2.接口成员的声明不能包含new之外的其他任何修饰符。
3.接口不能包含常量,字段,运算符,静态成员(这些与抽象方法不同),实例构造函数,析构函数或类型。
4.接口修饰符只允许使用new,public,protected,internal,private,接口的显式基接口必须至少和接口本身具有相同的可访问性,简单的理解就是基接口的可访问性>=子接口的可访问性
5.接口继承可以实现接口组合,即一个接口可以继承多个接口,一个类可以实现多个接口。
测试效果及代码:
1.类将继承有其基类提供的所有接口的实现,如果不显示的重新实现接口,派生类就无法以任何方式更改它从基类接口继承的映射。(其中接口的继承也可以实现隐藏,但是意义不大,这个可以简单的看做类似于普通类隐藏的一种多态机制)。
using System;
namespace IFace
{
interface IBase
{
void Paint();
}
interface Itest : IBase
{
new void Paint();
}
#region(测试没有重写基类的接口实现)
class A : Itest
{
public void Paint()
{
Console.WriteLine("A.Paint()");
}
}
class B:A
{
new public void Paint()
{
Console.WriteLine("B.Paint()");
}
}
#endregion
#region(测试覆盖基类的接口实现)
class C :Itest
{
public virtual void Paint()
{
Console.WriteLine("C.Paint()");
}
}
class D : C
{
sealed public override void Paint()
{
Console.WriteLine("D.Panit()");
}
}
#endregion
class Test
{
public static void Main()
{
A a = new A();
B b = new B();
C c = new C();
D d = new D();
IBase ia = a;
IBase ib = b;
Itest ic = c;
Itest id = d;
a.Paint(); //call:A.Paint()
b.Paint(); //call:B.Paint()
ia.Paint(); //call:A.Paint()
ib.Paint(); //call:A.Paint()
Console.WriteLine("========override-implementation========");
c.Paint(); //call:C.Paint()
d.Paint(); //call:D.Paint()
ic.Paint(); //call:C.Paint()
id.Paint(); //call:D.Paint()
Console.ReadKey();
}
}
}
namespace IFace
{
interface IBase
{
void Paint();
}
interface Itest : IBase
{
new void Paint();
}
#region(测试没有重写基类的接口实现)
class A : Itest
{
public void Paint()
{
Console.WriteLine("A.Paint()");
}
}
class B:A
{
new public void Paint()
{
Console.WriteLine("B.Paint()");
}
}
#endregion
#region(测试覆盖基类的接口实现)
class C :Itest
{
public virtual void Paint()
{
Console.WriteLine("C.Paint()");
}
}
class D : C
{
sealed public override void Paint()
{
Console.WriteLine("D.Panit()");
}
}
#endregion
class Test
{
public static void Main()
{
A a = new A();
B b = new B();
C c = new C();
D d = new D();
IBase ia = a;
IBase ib = b;
Itest ic = c;
Itest id = d;
a.Paint(); //call:A.Paint()
b.Paint(); //call:B.Paint()
ia.Paint(); //call:A.Paint()
ib.Paint(); //call:A.Paint()
Console.WriteLine("========override-implementation========");
c.Paint(); //call:C.Paint()
d.Paint(); //call:D.Paint()
ic.Paint(); //call:C.Paint()
id.Paint(); //call:D.Paint()
Console.ReadKey();
}
}
}
2.接口的重新实现与接口的初始实现遵循完全相同的接口映射规则,因此继承的接口映射不会对为了重新实现该接口而建立的接口映射产生任何影响。接口的重新实现也需要隐式的对其所有的基接口进行重新实现。
class Rep : Isub
{
public void F()
{
Console.WriteLine("Rep.F()");
}
public void G()
{
Console.WriteLine("Rep.G()");
}
}
class Rep_sub:Isub
{
public void F()
{
Console.WriteLine("Rep_sub.F()");
}
public void G()
{
Console.WriteLine("Rep_sub.G()");
}
}
{
public void F()
{
Console.WriteLine("Rep.F()");
}
public void G()
{
Console.WriteLine("Rep.G()");
}
}
class Rep_sub:Isub
{
public void F()
{
Console.WriteLine("Rep_sub.F()");
}
public void G()
{
Console.WriteLine("Rep_sub.G()");
}
}