在基本类型“virtual”中声明一个方法,然后在子类型中使用“override”关键字重写它,与在子类型中声明匹配的方法时简单地使用“new”关键字相比,两者之间有什么区别?


当前回答

不标记方法意味着:使用对象的编译类型绑定该方法,而不是运行时类型(静态绑定)。

用虚方法标记方法:使用对象的运行时类型绑定该方法,而不是编译时类型(动态绑定)。

在派生类中使用override标记基类虚方法意味着:这是使用对象的运行时类型绑定的方法(动态绑定)。

在派生类中用new标记基类虚方法意味着:这是一个新方法,它与基类中同名的方法没有关系,它应该使用对象的编译时类型进行绑定(静态绑定)。

在派生类中不标记基类虚方法意味着:该方法被标记为new(静态绑定)。

将一个方法标记为抽象意味着:这个方法是虚的,但是我不会为它声明一个主体,而且它的类也是抽象的(动态绑定)。

其他回答

Beyond just the technical details, I think using virtual/override communicates a lot of semantic information on the design. When you declare a method virtual, you indicate that you expect that implementing classes may want to provide their own, non-default implementations. Omitting this in a base class, likewise, declares the expectation that the default method ought to suffice for all implementing classes. Similarly, one can use abstract declarations to force implementing classes to provide their own implementation. Again, I think this communicates a lot about how the programmer expects the code to be used. If I were writing both the base and implementing classes and found myself using new I'd seriously rethink the decision not to make the method virtual in the parent and declare my intent specifically.

“new”关键字不会重写,它表示一个与基类方法无关的新方法。

public class Foo
{
     public bool DoSomething() { return false; }
}

public class Bar : Foo
{
     public new bool DoSomething() { return true; }
}

public class Test
{
    public static void Main ()
    {
        Foo test = new Bar ();
        Console.WriteLine (test.DoSomething ());
    }
}

它输出false,如果你使用override,它会输出true。

(基本代码取自Joseph Daigle)

所以,如果你在做真正的多态性,你应该总是OVERRIDE。唯一需要使用“new”的地方是当方法与基类版本没有任何关联时。

new关键字实际上创建了一个全新的成员,该成员只存在于该特定类型上。

例如

public class Foo
{
     public bool DoSomething() { return false; }
}

public class Bar : Foo
{
     public new bool DoSomething() { return true; }
}

该方法存在于这两种类型上。当您使用反射并获取Bar类型的成员时,您实际上会发现两个称为DoSomething()的方法看起来完全相同。通过使用new,你可以有效地将实现隐藏在基类中,这样当类从Bar派生出来时(在我的例子中),对base. dosomething()的方法调用就会到Bar而不是Foo。

new关键字用于隐藏。-意味着你在运行时隐藏你的方法。输出将基于基类方法。 Override用于重写。-表示您正在调用派生类方法引用基类。输出将基于派生类方法。

override关键字和new关键字之间的区别在于前者执行方法覆盖,后者执行方法隐藏。

查看以下链接获取更多信息…

MSDN及其他