override后,仍然可以使用base.XXX来访问被override的方法
new 后,不能访问基类的被new的方法了

解决方案 »

  1.   

    同意楼上的
    此外new还可以重写非virtual函数
      

  2.   

    virtual 方法就是用来重写的。
    这是面向对向语言多态的基础。你可以用一个基类的指针访问各个对象的virtual 方法。一般方法隐藏跟变量隐藏是一样的。
      

  3.   

    override的要求比较严格,不但要是virtual类型,参数格式要一致,访问权限,也要一样!
     而new就比较随便了——当然,有时候,多加、少加一个new,它会警告你! 我觉得,new关键字,是给程序员自己看的,没有其他意义,只是说明,基类有过这个东西而已!和全局变量被局部屏蔽一样,只不过是基类函数,被派生类函数屏蔽了而已!
    当然,还可以用base.*的方法,去访问基类函数的!
      

  4.   

    override和new的效果大不一样。你分别用override和new继承一个父类,然后用证明一个子类,将子类转换为父类,然后调用被override或new掉的方法,就可以看到他们的不同了。
    override是多态,而new 是一个新的方法。
      

  5.   

    public class Parent
    {
    public Parent()
    {

    }
    public virtual string getstr() {
    return "Parent";
    }
    }
    public class Child:Parent
    {
    public Child()
    { }
    public new string getstr() {
    return "Child";
    } }
    public class Test
    {
    public Test()
    { }
    public static void Main() {
    Parent p=new Child();
    Console.WriteLine(p.getstr());
    }
    }
    对于new的情况,显示parent;
    对于override的情况,显示child;
      

  6.   

    小弟总结如下:
    A a = new A();
    1.隐藏的函数 调用时取决于引用实例的变量类型(等号左边的内容)
    2.重写的函数 调用时取决于实例本身的类型(等号右边的内容)
    3.可以进行版本控制(这个我没做过)
    4.to:jiezhi(風依舊)
    override后的函数可以使用base.的方法来访问父类中的原函数 new以后的函数不能被使用base.的方法来访问父类中的原函数(好像不对,请看下面的代码)using System;
    namespace JacCompany
    {
    public class MainEntryPoint
    {
    public static void Main()
    {
    A a = new A();
    // A a = new B();// a.Hiddenf(111);
    a.ReWritef(111); }
    }

    class A
    {
    public virtual void ReWritef(int a) //要被重写的方法ReWritef
    {
    Console.WriteLine("这是父类A的ReWritef函数,a的值为: "+a);
    } public void Hiddenf(int a) //要被隐藏的方法Hiddenf
    {
    Console.WriteLine("这是父类A的Hiddenf函数,a的值为: "+a);
    }
    } class B:A
    {
    public override void ReWritef(int a) //开始重写方法ReWritef
    {
    base.ReWritef(234);
    Console.WriteLine("子类B的ReWritef函数,父类A的Hiddenf函数已经被重写!!! a的值的为: "+a);
    }

    public new void  Hiddenf(int a) //开始隐藏方法Hiddenf
    {
    base.Hiddenf(345);//仍调用被new过后的父类中的函数why?
    Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a);
    }
    }
    }
    请大家指教啊 谢谢
      

  7.   

    public new void  Hiddenf(int a) //开始隐藏方法Hiddenf
    {
    base.Hiddenf(345);//仍调用被new过后的父类中的函数why?
    Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a);
    }在这个函数中我仍然可以调用被new过后的父类中的函数,why?
      

  8.   

    呵呵,高手也有不小心说错了的时候嘛!
      
    我觉得,new关键字,是给程序员自己看的,没有其他意义,只是说明,基类有过这个东西而已!和全局变量被局部屏蔽一样,只不过是基类函数,被派生类函数屏蔽了而已!
    当然,还可以用base.*的方法,去访问基类函数的! new的作用,只是给程序员一点提醒而已,好像既不会起到动态联编的作用,又不会起到完全屏蔽基类的作用!
     所以它多加一个,少加一个,都一样可以通过编译——比如你基类,没有子类同样的函数,你一样可以加个new字的,而如果你基类有和子类同样的函数,你也同样可以不加new字的! 不知我的见解是否有错,请高手指教!
      

  9.   

    就说一遍:做一个抽象类A,有虚方法a(),做类B,C继承于A,在B中重写方法a(),在C中用new隐藏方法a(),然后 B myB = new B();C myC = new C();A myA = myB;A.a();myA = myC;myA.a();
    好了,应该有结论了,~-~
      

  10.   

    virtual 定义的函数在其子类中必须被重写
    new 则不必
    用virtual 的话 在函数调用时只能调用子类中重写的函数
    而用new则可以在子类中调用被隐藏的函数
      

  11.   

    to:  conan1211(柯楠) 用virtual 的话 在函数调用时只能调用子类中重写的函数这一句好像不对 我依然能调用父类中的virtual的方法啊
    就像下面的代码一样,你看我 A a = new a();a.ReWritef(111); //ReWritef可是虚函数啊,我照样能高校父类中的这个虚函数,谢谢大家 多多指教
    using System;
    namespace JacCompany
    {
    public class MainEntryPoint
    {
    public static void Main()
    {
    A a = new A();
    a.ReWritef(111); }
    }

    class A
    {
    public virtual void ReWritef(int a) //要被重写的方法ReWritef
    {
    Console.WriteLine("这是父类A的ReWritef函数,a的值为: "+a);
    } public void Hiddenf(int a) //要被隐藏的方法Hiddenf
    {
    Console.WriteLine("这是父类A的Hiddenf函数,a的值为: "+a);
    }
    } class B:A
    {
    public override void ReWritef(int a) //开始重写方法ReWritef
    {
    base.ReWritef(234);
    Console.WriteLine("子类B的ReWritef函数,父类A的Hiddenf函数已经被重写!!! a的值的为: "+a);
    }

    public new void  Hiddenf(int a) //开始隐藏方法Hiddenf
    {
    base.Hiddenf(345);//仍调用被new过后的父类中的函数why?
    Console.WriteLine("子类B的Hiddenf函数,父类A的Hiddenf函数已经被隐藏,a的值为: "+a);
    }
    }
    }