2009-10-18 8 views
1

다른 클래스로부터 상속을받는 두 클래스가 있고 둘 다에서 같은 메서드/속성 이름을 사용하는 경우 현재 개체가 있는지 여부에 관계없이 해당 메서드를 하위 클래스를 호출하는 방법을 만들 수 있습니까? 다시 기본 클래스로 캐스트합니다. 예를 들어상속 및 메서드/속성 재정의

(생략 외부 부품) :

public class MyBase { 
    public int GetNumber() { 
     return 1; 
    } 
} 

public class MyDerived : MyBase { 
    public new int GetNumber() { 
     return 20; 
    } 
} 

MyDervied someVar = new MyDerived(); 
int derivedVar = someVar.GetNumber(); // 20 

MyBase baseVar = (MyBase)someVar; 
int baseVar = baseVar.GetNumber(); // 1 

내 본능은 파생 클래스에 대한 재정 대신 새를 사용하는 것입니다,하지만 난 "어떤 멤버가 오버라이드 (override) 찾을 수 없습니다"얻을.

+0

아마도 내가 구체적인 예를 게시 했어야합니다. WPF와 ASP.NET에서 동일한 기본 클래스를 사용하려고합니다. WPF는 INotifyPropertyChanged를 사용하므로 실제로는 List 에서 ObservableCollection 으로베이스의 반환 유형을 변경하려고합니다. 처음에는 행운을 들이지 않고 기본 클래스의 IList를 사용해 보았습니다. – Echilon

+0

메서드에서 반환 한 형식을 변경하는 대신 해당 형식을 사용하는 WPF 코드 내에서 데이터를 변환 할 수 있습니다. 반환 유형을 List 으로 유지하는 경우 반환 된 값을 ObservableCollection의 생성자로 전달하면됩니다. 좀 더 자세한 조언을 얻기 위해 새로운 질문을하고 싶을 수도 있습니다. – dahlbyk

+0

감사합니다. ObservableCollection이 필요한 이유는 변경 알림이 필요한 컨트롤의 바인딩 때문입니다. – Echilon

답변

7

전에 기본 방법을 virtual으로 표시해야합니다.

public class MyBase { 
    public virtual int GetNumber() { 
     return 1; 
    } 
} 

public class MyDerived : MyBase { 
    public override int GetNumber() { 
     return 20; 
    } 
} 
1

dahlbyk입니다. new은 클래스를 파생시키고 새 멤버를 추가하려는 경우에 유용하지만 우연히 클래스에 동일한 이름의 멤버가 있습니다. 새로운 멤버를 추가하기위한 것이지 기존 멤버의 동작을 변경하는 것이 아닙니다.

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

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

... 

A x = new A(); 
x.Foo(); // prints "A.Foo()" 

B y = new B(); 
y.Foo(); // prints "B.Foo()" 

A z = y; 
z.Foo(); // prints "A.Foo()", not "B.Foo()"! 

참고 후자의 경우 "B.Foo()" 인쇄 할 재정의 된 방법에 비해 동작의 차이.

+0

감사. 아마도 나는 구체적인 예를 게시 했어야했다. 나는 WPF와 ASP.NET에서 같은 클래스를 사용하려고 노력하고있다. WPF는 INotifyPropertyChanged를 사용하므로 실제로는 List 에서 ObservableCollection 으로베이스의 반환 유형을 변경하려고합니다. – Echilon