선언 한정자로 사용되는 경우 키워드는 new 기본 클래스에서 상속된 멤버를 명시적으로 숨깁니다. 상속된 멤버를 숨기면 멤버의 파생 버전이 기본 클래스 버전을 대체합니다. 멤버가 표시된 private 경우 또는 경우에 따라 이미 숨겨져 있으므로 멤버의 기본 클래스 버전이 표시되어 있다고 가정합니다 internal. 한정자를 사용하지 않고 숨기 public 거나 protected 멤버를 new 숨길 수 있지만 컴파일러 경고가 표시됩니다. 멤버를 명시적으로 숨기는 데 사용하면 new 이 경고가 표시되지 않습니다.
키워드를 new 사용하여 형식의 인스턴스를 만들 거나 제네릭 형식 제약 조건으로 만들 수도 있습니다.
상속된 멤버를 숨기려면 동일한 멤버 이름을 사용하여 파생 클래스에서 선언하고 키워드로 new 수정합니다. 다음은 그 예입니다.
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
이 예제에서는 .에 BaseC.Invoke 의해 DerivedC.Invoke숨겨집니다. 필드 x 가 비슷한 이름으로 숨겨지지 않으므로 영향을 받지 않습니다.
상속을 통해 숨기는 이름은 다음 형식 중 하나를 사용합니다.
일반적으로 클래스 또는 구조체에 도입된 상수, 필드, 속성 또는 형식은 해당 이름을 공유하는 모든 기본 클래스 멤버를 숨깁니다. 특별한 경우가 있습니다. 예를 들어 이름을
N가진 새 필드를 호출할 수 없는 형식으로 선언하고 기본 형식이 메서드로 선언N하는 경우 새 필드는 호출 구문에서 기본 선언을 숨기지 않습니다. 자세한 내용은 C# 언어 사양의 멤버 조회 섹션을 참조하세요.클래스 또는 구조체에 도입된 메서드는 기본 클래스에서 해당 이름을 공유하는 속성, 필드 및 형식을 숨깁니다. 또한 서명이 동일한 모든 기본 클래스 메서드를 숨깁니다.
클래스 또는 구조체에 도입된 인덱서는 서명이 동일한 모든 기본 클래스 인덱서를 숨깁니다.
두 한정자는 상호 배타적인 의미를 가지므로 동일한 멤버에서 둘 다 new 사용하고 재정 의하는 것은 오류입니다.
new 한정자는 이름이 같은 새 멤버를 만들고 원래 멤버를 숨깁니다.
override 한정자는 상속된 멤버에 대한 구현을 확장합니다.
상속된 멤버를 new 숨기지 않는 선언에서 한정자를 사용하면 경고가 생성됩니다.
예시
이 예제에서 기본 클래스 BaseC및 파생 클래스 DerivedC는 상속된 필드의 값을 숨기는 동일한 필드 이름을 x사용합니다. 이 예제에서는 한정자를 사용하는 방법을 new 보여 줍니다. 또한 정규화된 이름을 사용하여 기본 클래스의 숨겨진 멤버에 액세스하는 방법을 보여 줍니다.
public class BaseC
{
public static int x = 55;
public static int y = 22;
}
public class DerivedC : BaseC
{
// Hide field 'x'.
new public static int x = 100;
static void Main()
{
// Display the new value of x:
Console.WriteLine(x);
// Display the hidden value of x:
Console.WriteLine(BaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}
/*
Output:
100
55
22
*/
이 예제에서 중첩 클래스는 기본 클래스에서 이름이 같은 클래스를 숨깁니다. 이 예제에서는 한정자를 사용하여 new 경고 메시지를 제거하는 방법과 정규화된 이름을 사용하여 숨겨진 클래스 멤버에 액세스하는 방법을 보여 줍니다.
public class BaseC
{
public class NestedC
{
public int x = 200;
public int y;
}
}
public class DerivedC : BaseC
{
// Nested type hiding the base type members.
new public class NestedC
{
public int x = 100;
public int y;
public int z;
}
static void Main()
{
// Creating an object from the overlapping class:
NestedC c1 = new NestedC();
// Creating an object from the hidden class:
BaseC.NestedC c2 = new BaseC.NestedC();
Console.WriteLine(c1.x);
Console.WriteLine(c2.x);
}
}
/*
Output:
100
200
*/
한정자를 new 제거하면 프로그램이 계속 컴파일되고 실행되지만 다음 경고가 표시됩니다.
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
C# 언어 사양
자세한 내용은 C# 언어 사양의 새 한정자 섹션을 참조하세요.
참고하십시오
.NET