new
는 REFERENCE 유형 (의 왼쪽)을 존중하여 =
참조 유형의 메소드를 실행 함을 의미합니다 . 재정의 된 메소드에 new
키워드 가 없으면 그대로 동작합니다. 또한 비다 형성 상속 이라고도 합니다. 즉,“기본 클래스에서 같은 이름의 메서드와는 전혀 관련이없는 파생 클래스에서 완전히 새로운 메서드를 만들고 있습니다.” -휘태커는
override
virtual
기본 클래스에서 키워드 와 함께 사용해야하는 , OBJECT 유형 (의 오른쪽)을 존중 =
하므로 참조 유형에 관계없이 메소드를 재정의 함을 의미합니다. 또한 다형성 상속 이라고도 합니다.
두 키워드가 서로 반대라는 것을 명심하는 나의 길.
override
: virtual
메소드를 대체하려면 키워드를 정의해야합니다. override
기본 클래스로 인스턴스화되는 경우 참조 유형 (기본 클래스 또는 파생 클래스의 참조)에 관계없이 키워드를 사용 하는 메소드는 기본 클래스의 메소드를 실행합니다. 그렇지 않으면 파생 클래스의 메서드가 실행됩니다.
new
: 키워드와 달리 메소드에서 키워드를 사용하는 override
경우 참조 유형이 중요합니다. 파생 클래스로 인스턴스화되고 참조 유형이 기본 클래스 인 경우 기본 클래스의 메소드가 실행됩니다. 파생 클래스로 인스턴스화되고 참조 유형이 파생 클래스 인 경우 파생 클래스의 메소드가 실행됩니다. 즉, override
키워드의 대비입니다 . Passant는 메소드에 새 키워드를 추가하거나 잊어 버린 경우 new
키워드가 사용될 때 컴파일러가 기본적으로 작동합니다 .
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
메인 전화 :
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
산출:
A
B
B
base test
derived test
새로운 코드 예제
하나씩 댓글을 달아 코드를 가지고 놀아보세요.
class X
{
protected internal /*virtual*/ void Method()
{
WriteLine("X");
}
}
class Y : X
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Y");
}
}
class Z : Y
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Z");
}
}
class Programxyz
{
private static void Main(string[] args)
{
X v = new Z();
//Y v = new Z();
//Z v = new Z();
v.Method();
}