1

MSDN 说:

当用作修饰符时,new 关键字显式隐藏从基类继承的成员。当您隐藏继承的成员时,该成员的派生版本将替换基类版本。尽管您可以在不使用 new 修饰符的情况下隐藏成员,但结果是警告。如果您使用 new 显式隐藏成员,它会抑制此警告并记录派生版本旨在作为替换的事实。

例子:

class Base
{
 int value;

 virtual bool Foo()
 {
   value++;
 }
}

class Derived : Base
{
 int value;

 override bool Foo()
 {
  value++;
 }

}

我必须在newDerived.value 声明中添加修饰符吗?有什么变化?

4

4 回答 4

15

由于该value字段是private,因此无法在派生类中访问它。因此,派生类中的声明并没有真正隐藏任何东西。您不应该添加new到声明中。如果你这样做了,什么都不会改变,除了编译器会警告你使用new不正确。如果该value字段在派生类中是可访问的(例如它是public),那么您应该使用new来表达您隐藏基成员的意图:

class A {
    public int field;
}
class B : A {
    public int field; // warning. `B.field` hides `A.field`. 
}

使用new将使该警告静音(它不会产生其他影响):

class B : A {
    public new int field; // Dear compiler, shut up please.
}

您不能将方法声明为既overridenew。它们是相互排斥的。

于 2009-12-17T15:35:21.707 回答
2

鉴于您的示例, Derived.value 不是“隐藏” Base.value。C# 的默认访问修饰符是 Private。如果您将 Base.value 设为 Public,那么是的,使用新的修饰符将删除警告。

于 2009-12-17T15:40:50.717 回答
1

new 修饰符主要用于隐藏非虚方法。与 override 修饰符不同,它用于隐藏所有类成员,而不仅仅是方法(即变量和属性)。

主要目的是当您使用它来隐藏方法而不是使用 override 时(顺便说一下,要隐藏方法,您不能同时使用 override 和 new。这会给您带来错误,而不仅仅是减弱)。

使用 virtual 和 override 修饰符将始终类似于使用 new 修饰符,除了当您使用 virtual 和 override 时,您不能调用 Base 类,除非从 Child 类本身内部

于 2009-12-17T15:46:12.547 回答
0

不,您不这样做,因为在这种情况下,基方法被标记为virtual,因此基类打算覆盖此方法。

您可能需要使用new修饰符的情况是基方法未标记为virtual,例如:

class Base
{
    int value;

    public void Foo()
    {
        value++;
    }
}

class Derived : Base
{
    int value;

    new public void Foo()
    {
        value--;
    }
}

此外,在您上面的示例中,我们必须假设基Foo方法被标记为publicor protected,否则virtual修饰符的使用无论如何都是毫无意义的,因为它对基类/其他类不可见。

于 2009-12-17T15:43:34.140 回答