C#接口在子类的声明区别
有如下三个类:
public class BaseClass:ICloneable
{
public void Clone()
{
System.Diagnostics.Debug.WriteLine("base");
}
}
public class Derived1Class : BaseClass
{
public new void Clone()
{
System.Diagnostics.Debug.WriteLine("Derived1");
}
}
public class Derived2Class :BaseClass,ICloneable
{
public new void Clone()
{
System.Diagnostics.Debug.WriteLine("Derived2");
}
}
以不同调用方式调用Clone
:
BaseClass bc0 = new BaseClass();
bc0.pr();
BaseClass bc1 = new Derived1Class();
bc1.pr();
BaseClass bc2 = new Derived2Class();
bc2.pr();
Derived1Class dc1 = new Derived1Class();
dc1.pr();
Derived2Class dc2 = new Derived2Class();
dc2.pr();
f f1 = new BaseClass();
f1.pr();
f f2 = new Derived1Class();
f2.pr();
f f3 = new Derived2Class();
f3.pr();
输出:
base
base
base
Derived1
Derived2
base
base
Derived2
可见,通过基类变量调用Clone
,不管基类指向的是否是子类,必定调用基类的Clone
;
通过子类变量调用Clone
,一定调用子类重写的Clone
;
通过接口调用时,若传送给接口变量的子类实例没有显式实现接口,接口变量将调用父类Clone
。