本文摘自PHP中文网,作者黄舟,侵删。
理解接口方法和虚方法的区别
第一眼看来,实现接口和覆写虚方法似乎没有什么区别,实际上,实现接口和覆写虚方法之间的差别很大!!!
派生不能覆写接口的非虚成员
接口中声明的成员方法默认情况下并非虚方法,所以,派生类不能覆写基类中实现接口的非虚成员。
看一个例子。
定义接口ITest:
1 2 3 | public interface ITest
{ void Test();
}
|
实现接口的Base类和Derive类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Base:ITest
{ public Base()
{
Console.WriteLine( "This is base constructor" );
}
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" );
}
public void Test()
{
Console.WriteLine( "This is in Derive to ITest implement" );
}
}
|
调用对象Base和Derive:
1 2 3 4 5 6 | Base b = new Base();
b.Test();
Base d = new Derive();
d.Test();
Console.ReadLine();
|
输出结果为:

可以看出,b和d实例的Test方法实现的行为都是位于基类的!!!这表明了,派生类不能覆写基类中实现接口的成员(非虚方法)
但是,请看下面调用:
1 2 3 4 5 | Base b = new Base();
b.Test();
Derive d = new Derive();
d.Test();
Console.ReadLine();
|
输出结果为:

因此,如果想要继承的对象调用接口实现方法,只能声明为Derive实例。这样做不符合Effective C#中变量都声明为基实例的原则!!!
派生类方法个性,将基类方法转为虚方法
避免这种使用上的混淆,如果确实派生类实现方法是个性行为,那么需要将基类的实现接口的方法前加virtual修饰符!
代码修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Base:ITest
{ public Base()
{
Console.WriteLine( "This is base constructor" );
} public virtual void Test()
{
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()
{
Console.WriteLine( "This is in Derive to ITest implemnt" );
}
}
|
一次实现,多个关联对象使用
观察上面的代码,我们发现,在基类中实现的接口,如果派生类也想实现此接口,那么它默认继承了基类的接口实现,所以不用重复写代码实现接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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#设计模式-派生类实现非虚接口陷阱的实例代码分享的详细内容!
相关阅读 >>
C#执行原理深入解析(图文)
详细介绍用C#描述数据结构2:array的图文代码实例
C# 获取随机字符串实现方法
C# 中虚方法和抽象方法
史上最佳的C#编程书籍推荐
新手学习.net编程计划-1
C#获取本机ip搜集整理7种方法的示例代码分享
用C#描述数据结构1:统计代码执行时间对象的代码详解
简述C#中builder和buffer类的用法详解
C# 应用npoi获取excel中的图片,保存至本地的算法的图文代码实例详解
更多相关阅读请进入《C#》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C#设计模式-派生类实现非虚接口陷阱的实例代码分享