我见过像这样声明的方法:
public void new SortItems()
这实际上是做什么的?我知道new
关键字用于调用构造函数,但我也在方法定义中看到它,如上例所示。
答案 0 :(得分:4)
使用这种方式时,它是修饰符。它用于隐藏继承的成员而不是覆盖它。如果基本方法是密封的,这很有用。这是一个快速示例,用于演示覆盖和隐藏继承成员之间的区别:
public class Foo
{
public virtual void OverriddenMethod() { Console.WriteLine("foo"); }
public void HiddenMethod() { Console.WriteLine("foo"); }
}
public class Bar : Foo
{
public override void OverriddenMethod() { Console.WriteLine("bar"); }
public new void HiddenMethod() { Console.WriteLine("bar"); }
}
void Main()
{
Bar bar = new Bar();
Foo foo = bar;
bar.OverriddenMethod(); // "bar"
bar.HiddenMethod(); // "bar"
foo.OverriddenMethod(); // "bar"
foo.HiddenMethod(); // "foo"
}
进一步阅读
答案 1 :(得分:3)
应该是这样的:
public new void SortItems(){
//...
}
这个new
关键字用于遮蔽基本成员(方法,属性,...),它具有相同的名称(对于属性,事件...)和相同的签名(对于方法),在此case是方法SortItems
。它与创建新实例时的new
不同。无论使用new
来隐藏基类中的冲突的成员,要访问基本成员,您必须使用关键字base
在派生类中访问它。
答案 2 :(得分:1)
在方法签名中使用时,意味着定义它们的类的实现细节是不同的。这种方法的问题在于它不是多态的,所以:
class Thing
{
void DoSomething()
{
Console.WriteLine("Thing");
}
}
class Other : Thing
{
new void DoSomething()
{
Console.WriteLine("Other");
}
}
var thing = new Thing();
thing.DoSomething(); \\ prints Thing
var other = new Other();
other.DoSomething(); \\ prints Other
((Thing)other).DoSomething(); \\ prints Thing
答案 3 :(得分:0)
这是覆盖的反面。说你有:
public class A
{
public virtual void f() { Console.WriteLine( "A" ); }
}
public class B : A
{
public override void f() { Console.WriteLine( "B" ); }
}
public class C : A
{
public new void f() { Console.WriteLine( "C" ); }
}
然后在主要:
A b = new B();
A c = new C();
b.f();
c.f();
(c as C).f();
这将打印:
B
A
C
当类型是定义类的类型时,它只会调用new
方法。