2014-01-23 36 views
2

我不太了解C#中的修饰符new:根据new修饰符的存在,以下代码的不同方式会有所不同?关于C#中的新修饰符

class A 
    { 
     public void F() { Console.WriteLine("A::F()"); } 
    } 


class B : A 
    { 
    public new void F() { Console.WriteLine("B::F()"); } 

    public static void Main() 
    { 
     A a = new B(); 
     B b = new B(); 
     A trueA = new A(); 
     a.F(); 
     b.F(); 
     trueA.F(); 
     Console.ReadLine(); 
    } 
} 

C++中是否有任何等效或类似的东西?

+1

我认为你的意思是[new operator](http://msdn.microsoft.com/en-us/library/fa0ab757.aspx) – Habib

+0

@Habib假设代码甚至不会编译,如果'new'运算符被删除,我认为OP意味着'new'修饰符。 –

+0

@ p.s.w.g,我认为代码会编译,但它只会给方法隐藏提供一个警告。是的,你是正确的OP是问隐藏方法,而不是新的运营商。 – Habib

回答

4

如果在B类中使用public void F()public new void F(),结果相同。该方法仍将被遮蔽。

不同之处在于,如果您省略了new修饰符,您将收到编译器警告,因为代码可能会造成混淆。 new修饰符用于指定您实际上打算从基类中映射成员,并且不会错误地使用相同的名称。

0

如果您在基类中定义了虚拟方法,您会看到不同之处。 override修饰符扩展了基类方法,新修饰符通过创建一个与基类中的方法无关的新方法来隐藏它。 尝试下一编码:

class Program 
{ 
class A 
{ 
    public virtual void F() { Console.WriteLine("A::F()"); } 
    public virtual void G() { Console.WriteLine("A::G()"); } 
} 


class B : A 
{ 
    public override void F() { Console.WriteLine("B::F()"); } 
    public new void G() { Console.WriteLine("B::G()"); } 

    public static void Main() 
    { 
    A a = new B(); 
    B b = new B(); 
    a.F(); 
    b.F(); 
    a.G(); 
    b.G(); 

    Console.ReadLine(); 
    } 
} 

}

在C++中,你可以通过在派生类定义的方法具有相同的名称,但不同的参数隐藏的基类的方法。也许你可以使用它。