MSDN说:
当用作修饰符时,新的 关键字显式隐藏成员 继承自基类。当你 隐藏继承的成员,派生 该成员的版本取代了 基类版本。虽然你可以 隐藏成员而不使用 新修饰符,结果是警告。 如果你使用new来明确隐藏一个 会员,它抑制了这个警告和 记录派生的事实 版本旨在替代。
示例:
class Base
{
int value;
virtual bool Foo()
{
value++;
}
}
class Derived : Base
{
int value;
override bool Foo()
{
value++;
}
}
我是否必须在Derived.value声明中添加new
修饰符?有什么变化?
答案 0 :(得分:14)
由于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
。它们是相互排斥的。
答案 1 :(得分:2)
根据您的示例,Derived.value不会“隐藏”Base.value。 C#的默认访问修饰符是Private。如果你使Base.value公开,那么是的,使用new modifer将删除警告。
答案 2 :(得分:1)
new修饰符主要用于隐藏非虚方法。与覆盖修饰符不同,它不仅用于隐藏所有类成员(即变量和属性)。
主要目的是当你使用它来隐藏一个方法而不是使用覆盖时(顺便说一句,隐藏一个方法,你不能同时使用覆盖和新的。这会给你一个错误而不仅仅是一个渐弱)。
使用virtual和override修饰符总是类似于使用new修饰符,除了当你使用virtual和override时,除了从Child类本身内部之外你不能调用Base类
答案 3 :(得分:0)
不,不,因为在这种情况下,基本方法被标记为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
修饰符的使用是有点无意义,因为它不会被基地/其他班级看到。