技术开发 频道

.NET中的虚函数

  如果读者理解了上面的内容,那么来看看一个略微复杂的情况:我们邀请interface出场!

interface IA   {
        
void Foo();
}
    
class CA: IA  {
        
public void Foo()  {
            Console.WriteLine(
"CA.Foo");
        }
}

 

  [问题]: Foo是虚函数吗?

  答案是肯定的,就像interface方法不能显示声明为public一样,我们也不能在IA.Foo前面加上virtual。原因很简单,所有的interface方法都是虚函数!在调用interface方法的时候,总是要使用运行时绑定。

  [问题]: CA实现IA,那么CA.Foo前面需要override吗?

  答案是否定的,在C#中,继承和实现是截然不同的两个概念,尽管在语法上很相似。继承意味着全盘接收基类的函数,而实现只是一个契约,保证当前类会提供interface中声明的函数,而不会接受基类的函数(事实上也不能,因为interface中没有函数的实现)

  [问题]: CA实现IA,那么CA.Foo前面需要virtual吗?

  答案是需要的,否则的话,CA的子类将无法覆写Foo,下面的代码是CA.Foo的IL声明,我们发现了关键字final(注:这里的final是IL语言的关键字,和C#中sealed有些类似,意味着子类不能override当前函数)

.method public hidebysig newslot virtual final
          instance
void  Foo() cil managed

 

  下面一段代码紧接着上面的代码,读者可以猜测一下输出,看看是否掌握了本文今天讲述的内容,我会在下期博客中讲解其原委,并且和大家进一步通过IL来研究.NET中的虚函数。

class CB : CA, IA  {
        
public void Foo()   {
           Console.WriteLine(
"CB.Foo");
       }
}
class Test   {
        
public static void InvokeFoo(CA ia)  {
            ca.Foo();
        }
        
public static void Main()   {
            InvokeFoo(
new CA());
            InvokeFoo(
new CB());
          }
0
相关文章