日期:2014-05-18  浏览次数:20743 次

new与override的区别 求解答下面代码
using system;
public class A
{
  public string o;
  public A(string i)
  {
  o=i;
  }
 }
public class B
 {
  static void Main()
  A a=new A("wangshijin")
 ConSole.Writeline(a)
 }
这段代码的运行结果是:A原因是基类中的ToString()方法中的定义。
现在我想覆盖掉祖先类object的ToString()方法
new public string ToString()
{
return o;
}
或者
public override string ToString()
{
return o;
}
但是运行结果不一样 求解答。new方法结果依旧不变。

------解决方案--------------------
ConSole.Writeline(a.ToString())
------解决方案--------------------
http://so.csdn.net/search?t=thread&q=new%20override
csdn里就有很多
估计google和baidu会有更多
------解决方案--------------------
new关键字只是起隐藏的作用,而override才是真正的重写。

比如一个类A有方法SomeFunction(标志为override),类B继承类A,也拥有一个同名方法SomeFunction,由于子类B拥有和父类同名方法,所以就必须对该方法进行说明,说明方式可以是new和override,两种方式的区别在于调用该方法时对象的身份,具体如下,我先假设类A中的SomeFunction输出A' SomeFunction , 类B中的SomeFunction输出B’ SomeFunction。

C# code

class A
{
    public override void SomeFunction()
    {
        Console.WriteLine("A' SomeFunction");
    }
}

class B
{
    public override void SomeFunction()
    {
        Console.WriteLine("B' SomeFunction");
    }
}

class Program
{
    B objB = new B();
    objB.SomeFunction(); //对象的身份为B,输出结果就按B类中的结果输出
     ((A)objB).SomeFunction(); //对象的身份为A,输出结果仍然按B类中的结果输出。原因就是子类重写override了父类的方法,一旦子类对象创建完毕,无论是将其看成B类对象还是A类对象,方法执行都将按照子类中实现的方式进行
}

------------------------------------------------
class A
{
    public override void SomeFunction()
    {
        Console.WriteLine("A' SomeFunction");
    }
}

class B
{
    public new void SomeFunction()//隐藏
    {
        Console.WriteLine("B' SomeFunction");
    }
}

class Program
{
    B objB = new B();
    objB.SomeFunction(); //对象的身份为B,输出结果就按B类中的结果输出
     ((A)objB).SomeFunction(); //对象的身份为A,输出结果按A类中的结果输出。原因就是子类仅仅只是隐藏了父类的方法,一旦子类对象被其看成A类对象,方法执行都将按照A类中实现的方式进行
}