成员声明中“新”的确切含义

时间:2013-11-16 18:48:35

标签: c# .net oop inheritance member

我见过像这样声明的方法:

public void new SortItems()

这实际上是做什么的?我知道new关键字用于调用构造函数,但我也在方法定义中看到它,如上例所示。

4 个答案:

答案 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方法。