请问在这两个方法有何区别?
其中虚方法的作用?
何时用方法一,何时用方法二?方法一:父类中使用虚函数,然后在子类中重写(override)
class A
{
  public virtual void dosomething()
   {
        ...........
    }
}class B:A
{
  public override void dosomething()
   {
        ...........
    }
}
----------------------------
方法二:父类中使用普通函数,然后在子类中隐藏(new)
class A
{
  public void dosomething()
   {
        ...........
    }
}class B:A
{
  public new void dosomething()
   {
        ...........
    }
}

解决方案 »

  1.   

    执行一下就清楚了..
    static void Main(string[] args)
            {
                Test();
                Console.ReadLine();
            }
            static void Test()
            {
                B b = new B();
                b.dosomething();
                A a = b;
                a.dosomething();
                D d = new D();
                d.dosomething();
                C c = d;
                c.dosomething();
            }        class A
            {
                public virtual void dosomething()
                {
                    Console.WriteLine("A.virtual");
                }
            }        class B : A
            {
                public override void dosomething()
                {
                    Console.WriteLine("B.override");
                }
            }        class C
            {
                public void dosomething()
                {
                    Console.WriteLine("C.Source");
                }
            }        class D : C
            {
                public new void dosomething()
                {
                    Console.WriteLine("D.NEW");
                }
            }
      

  2.   

    override被转回基类时,调用的是用于创建对象的类的方法
    new被转回基类时,调用的是对象基类的方法
    new还有一个特殊的地方,就是可以重写非虚函数
      

  3.   

    两者区别在于,虚函数总能调用到正确的,即根据当前类型来调用;而new并不是这样。因此在通过基类进行转化的时候,虚函数会根据对象真正类型,而调用相应的函数;
    例如:
    A objA = new B();
    objA.dosomething();//Call B::dosomething method, not A::dosomething 而对于new来说,函数的调用不会产生多态,会根据定义类型而进行调用
    例如:
    A objA = new B();
    objA.dosomething();//Call A::dosomething method, not B::dosomething 因此前者属于多态,属于后绑定,需要在运行的时候才能知道调用的是哪个类型方法;而后者属于静态绑定,在编译的时候已经确定了调用的类型方法。
      

  4.   

    个人感觉这里的new就和C++里不用new效果一样
      

  5.   

    jointan() ( ) 信誉:98    Blog  2006-10-10 0:11:59  得分: 0  
     
     
       
    override被转回基类时,调用的是用于创建对象的类的方法
    new被转回基类时,调用的是对象基类的方法
    new还有一个特殊的地方,就是可以重写非虚函数  
     
    说的够清楚了