C#中的新修饰符
MSDN说:
当用作修饰符时,new关键字显式隐藏从基类inheritance的成员。 隐藏inheritance的成员时,该成员的派生版本将替换基类版本。 虽然您可以在不使用new修饰符的情况下隐藏成员,但结果是警告。 如果使用new来显式隐藏成员,它会抑制此警告并记录派生版本旨在替代的事实。
例:
class Base { int value; virtual bool Foo() { value++; } } class Derived : Base { int value; override bool Foo() { value++; } }
我是否必须在Derived.value声明中添加new
修饰符? 有什么变化?
由于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. }
您不能将方法声明为override
和new
。 它们是互斥的。
举个例子,Derived.value不是“隐藏”Base.value。 C#的默认访问修饰符是Private。 如果你使Base.value公开,那么是的,使用new modifer将删除警告。
new修饰符主要用于隐藏非虚方法。 与覆盖修饰符不同,它不仅用于隐藏所有类成员(即变量和属性)。
主要目的是当你使用它隐藏一个方法而不是使用覆盖时(顺便说一句,隐藏一个方法,你不能同时使用覆盖和新的。这会给你一个错误而不仅仅是一个渐弱)。
使用virtual和override修饰符总是类似于使用new修饰符,除了当你使用virtual和override时你不能调用Base类,除了从Child类本身内部
不,你不这样做,因为在这种情况下,基本方法被标记为virtual
,因此基本类会覆盖此方法。
您可能需要使用new
修饰符的情况是基本方法未标记为virtual
,例如:
class Base { int value; public void Foo() { value++; } } class Derived : Base { int value; new public void Foo() { value--; } }
此外,在上面的示例中,我们必须假设基本Foo
方法被标记为public
或protected
,否则virtual
修饰符的使用无论如何都是无意义的,因为它对于base / other类是不可见的。