明白接口要领和虚要领的区分
第一眼看来,完成接口和覆写虚要领好像没有什么区分,实际上,完成接口和覆写虚要领之间的差异很大!!!
派生不能覆写接口的非虚成员
接口中声明的成员要领默许情况下并非虚要领,所以,派生类不能覆写基类中完成接口的非虚成员。
看一个例子。
定义接口ITest:
public interface ITest { void Test(); }
完成接口的Base类和Derive类
public class Base:ITest { public Base() { Console.WriteLine("This is base constructor"); } //完成ITest接口 public void Test() { Console.WriteLine("This is in base to ITest implement"); } } public class Derive :Base,ITest { public Derive() { Console.WriteLine("This is derived constructor"); } //测试Derive类完成了ITest吗?? public void Test() { Console.WriteLine("This is in Derive to ITest implement"); } }
挪用对象Base和Derive:
Base b = new Base(); b.Test(); Base d = new Derive();//将d声明为Base对象 d.Test(); Console.ReadLine();
输出效果为:
能够看出,b和d实例的Test要领完成的行动都是位于基类的!!!这表明了,派生类不能覆写基类中完成接口的成员(非虚要领)
然则,请看下面挪用:
Base b = new Base(); b.Test(); Derive d = new Derive(); //将d声明为Derive对象 d.Test(); Console.ReadLine();
输出效果为:
因而,假如想要继续的对象挪用接口完成要领,只能声明为Derive实例。如许做不符合Effective C#中变量都声明为基实例的准绳!!!
派生类要领特性,将基类要领转为虚要领
防止这类运用上的殽杂,假如确切派生类完成要领是特性行动,那末需要将基类的完成接口的要领前加virtual修饰符!
代码修正以下:
public class Base:ITest { public Base() { Console.WriteLine("This is base constructor"); } public virtual void Test() //完成ITest接口的虚要领 { Console.WriteLine("This is in base to ITest implemnt"); } } public class Derive :Base,ITest { public Derive() { Console.WriteLine("This is derived constructor"); } public override void Test() //完成接口ITest的复写要领 { Console.WriteLine("This is in Derive to ITest implemnt"); } }
一次完成,多个关联对象运用
视察上面的代码,我们发明,在基类中完成的接口,假如派生类也想完成此接口,那末它默许继续了基类的接口完成,所以不必重复写代码完成接口。
public interface ITest { void Test(); } public class Base:ITest { public Base() { Console.WriteLine("This is base constructor"); } public void Test() { Console.WriteLine("This is in base to ITest implemnt"); } } public class Derive :Base,ITest { public Derive() { Console.WriteLine("This is derived constructor"); } }
总结:
1、 派生不能覆写接口的非虚成员;
2、假如派生类要领是特性要领,将基类要领转为虚要领;
3、若基类完成了接口要领,将派生类也显现地继续此接口,然则不必再次完成了!!!
以上就是C#设想形式-派生类完成非虚接口圈套的实例代码分享的细致内容,更多请关注ki4网别的相干文章!