2014-01-23 1 views
2

수정 자 new이 C# 인 경우 : 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가 제거되었다고 생각합니다. OP는 '새로운'수정자를 의미합니다. –

+0

@ p.swg, 코드가 컴파일 될 것이라고 생각하지만 메소드 숨기기에 대한 경고 만 제공합니다. 네가 OP가 새로운 연산자가 아니라 숨어있는 방법에 대해 묻고 있습니다. – Habib

답변

4

public void F() 또는 public new void F()을 클래스 B에 사용하면 결과가 동일합니다. 이 메서드는 여전히 섀도 잉됩니다.

new 수정자를 생략하면 코드가 혼동을 줄 수 있으므로 컴파일러 경고가 표시됩니다. new 수정자는 실제로 기본 클래스의 멤버를 섀도 잉하려는 의도를 지정하는 데 사용되며 실수로 같은 이름을 사용하지 않았습니다.

0

가상 클래스 메서드를 기본 클래스로 정의하면 차이점이 나타납니다. override 한정자는 기본 클래스 메서드를 확장하고 새 수정자는 기본 클래스에서와 아무런 관련이없는 새로운 메서드를 만들어 숨깁니다. 다음 코드를보십시오 : 당신은 이름은 같지만 서로 다른 매개 변수를 사용하여 파생 클래스의 메소드를 정의하여 기본 클래스의 메서드를 숨길 수 있습니다 ++ C에서

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(); 
    } 
} 

}

. 어쩌면 당신이 그것을 사용할 수 있습니다.