표시 한 두 번째 예제에서는 부모의 GetData를 숨기고 무시합니다.
예 :
private class Base
{
public virtual void Test()
{
Console.WriteLine("Base");
}
public void Test2()
{
Console.WriteLine("Base");
}
}
private class Derived : Base
{
public override void Test()
{
Console.WriteLine("Derived");
}
public void Test2()
{
Console.WriteLine("Derived");
}
}
static void Main()
{
Base b = new Base();
Derived d = new Derived();
Base dInB = new Derived();
b.Test();
d.Test();
dInB.Test();
b.Test2();
d.Test2();
dInB.Test2();
Console.ReadKey(true);
}
그것은 출력 : 그것은 파생 클래스에서 public new void Test2()
에 new
키워드를 사용해야하기 때문에
Base // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base // Base.Test2()
Derived // Derived.Test2()
Base // You think you're calling Derived.Test2(), but you actually call Base.Test2()
사실이 샘플은 유효하지 않습니다.
이것은 연산자 오버로딩과 동일하게 작동합니다. 실제로 아무 것도 무시하지 않습니다. 정확한 유형이 Derived
이면 새 메소드가 호출됩니다.
멤버를 숨기는 데주의해야합니다. 클래스를 재정의하거나 (인터페이스)를 구현하는 것과 같은 것이 아닙니다.정확히 유형이있는 경우에만new
메쏘드를 호출합니다. 그렇지 않으면 여전히 기본 유형의 메소드가 호출됩니다.
B.GetData() 아래에 구불 구불 한가 보입니까? 보기 + 오류 목록에 경고가 표시됩니까? 놓치기 힘든, 당신이하고있는 것을 알 때 * new * 키워드를 사용하십시오. –
첫 번째 예제에서 B의 메서드는 private 일 수 없습니다. 컴파일되지 않습니다. – TrueWill