C#接口在子类的声明区别

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

posted @ 2019-11-28 17:03  shadowfish0  阅读(295)  评论(0编辑  收藏  举报