今天发现C#虚函数简直妙不可言....

 
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  ConsoleApplication2
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
// A a = new A();
            
// B b = new B();
            C c  =   new  C();
            
// b.GetYear();
        }
    }

    
public   class  A
    {
        
public  A()
        {
            Console.WriteLine(
" DEBUG: A constructing " );
           
            
this .GetYear();
        }

        
public   virtual   void  GetYear()
        {
            Console.WriteLine(
" A " );
        }
    }

    
public   class  B:A
    {
        
public  B(): base ()
        {
            Console.WriteLine(
" DEBUG: B constructing " );
            
this .GetYear();
        }

        
public   override   void  GetYear()
        {
            
// base.GetYear();
            Console.WriteLine( " B " );
        }
    }

    
public   class  C : B
    {
        
public  C()
        {
            Console.WriteLine(
" DEBUG : C constructing " );
            
this .GetYear();
        }

        
public   override   void  GetYear()
        {
            
// base.GetYear();
            Console.WriteLine( " C " );
        }

    }
   

}

 

运行结果:一定大出你的意料吧!

 

 如果把代码改一下:

 

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  ConsoleApplication2
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
//A a = new A();
            C c = new C();

            
// c.GetYear();
            
//b.GetYear();
        }

    }


    
public class A
    
{
        
public A()
        
{
            Console.WriteLine(
"DEBUG: A constructing");
            
this.GetYear();
        }


        
protected  void GetYear()
        
{
            Console.WriteLine(
"A");
        }

    }


    
public class B:A
    
{
        
public B():base()
        
{
            Console.WriteLine(
"DEBUG: B constructing");
            
this.GetYear();
        }


        
protected void GetYear()
        
{
            
//base.GetYear();
            Console.WriteLine("B");
        }

    }


    
public class C : B
    
{
        
public C():base()
        
{
            Console.WriteLine(
"DEBUG: C constructing");
            
//base.GetYear();
            this.GetYear();
        }


        
protected void  GetYear()
        
{
            
//base.GetYear();
            Console.WriteLine("C");
        }

    }


}

通过这两个例子,终于好像彻底明白了虚函数和new(子类屏蔽父类的方法的关键字).

不过还有更cool点儿的.....请看下面的例子,仔细看小心头晕哦,哈:)

 

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  ConsoleApplication2
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
//A a = new A();
            
//C c = new C();
            D d = new D();

            
// c.GetYear();
            
//b.GetYear();
        }

    }


    
public class A
    
{
        
public A()
        
{
            Console.WriteLine(
"DEBUG: A constructing");
            
this.GetYear();
        }


        
protected virtual void GetYear()
        
{
            Console.WriteLine(
"A");
        }

    }


    
public class B:A
    
{
        
public B():base()
        
{
            Console.WriteLine(
"DEBUG: B constructing");
            
this.GetYear();
        }


        
//protected override void GetYear()
        
//{
        
//    //base.GetYear();
        
//    Console.WriteLine("B");
        
//}
    }


    
public class C : B
    
{
        
public C():base()
        
{
            Console.WriteLine(
"DEBUG: C constructing");
            
//base.GetYear();
            this.GetYear();
        }


        
protected override void  GetYear()
        
{
            
//base.GetYear();
            Console.WriteLine("C");
        }

        
        
//protected new  void GetYear()
        
//{
        
//    //base.GetYear();
        
//    Console.WriteLine("C");
        
//}

    }


    
public class D : C
    
{
        
public D()
        
{
            Console.WriteLine(
"DEBUG: D contructing");
            
this.GetYear();
        }


    }


}
怎么样,发现了吧.虚函数和new的确有很多相似的地方,甚至如果仅以实现程序为目的的话,应该可以互换的,不是吗?
听起来怎么有点玄啊!没错,肯定不是的.是很相似,不过肯定有不一样的地方.可在哪里呢?

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值