2012-07-23 2 views
0

저는 C#을 처음 접했지만 꽤 좋은 C++ 지식을 가지고 있습니다. C++에서 저는 다음과 같은 것을 사용합니다 :상속은 공분산없이 어떻게 합리적 일 수 있습니까? (C#)

class Base1 {}; 
class Derived1 : Base1 {}; 
class Base2 { 
    Base1 foo(); 
}; 
class Derived2 { 
    Derived1 foo(); 
}; 

나는 공분계라는 용어로 알고 있습니다. 코드 조각은 무언가를 놓칠지도 모르지만 당신이 내가하고 싶은 말을 얻기를 바랍니다. C#에서 오버 라이드 (override) 등을 사용하여 이와 비슷한 것을 만들려고 시도하면서 컴파일러는 형식이 동일해야한다고 불평했습니다. 다음과 같이하십시오 :

class Base1 {}; 
class Derived1 : Base1 {}; 
class Base2 { 
    Base1 foo(); 
}; 
class Derived2 { 
    Base1 foo(); 
}; 

어떤 문제가 발생할 수 있습니까? 물론 foo 함수의 프로그래머이므로 항상 Derived1이 반환 될 것이라고 확신 할 수 있습니다. 하지만 내 기능을 부르는 사람은 그 사실을 모릅니다.

저는 인터페이스 IManager를 사용하고자하는 관리자 클래스가있는 프로젝트를 가지고 있습니다.이 클래스는 이름이있는 경우 .NET이 아닌 다른 클래스가 있습니다. Load() 메소드를 구현하십시오. Load()는 항상 특정 Manager에 의해 관리되는 Object를 반환합니다. 모든 관리자가 iManager를를 구현하는 경우 , 그들 모두는

ManagableObject Load(); 

좋은, 나쁜인가요 인터페이스 얻을 것? 아니면 더 나은 방법이 있을까요?

나는 또한 템플릿을 사용하여 작동하는지 읽을 수 있지만 같은 것 같아요 :

List<Base1> myList; 
myList.push_back(new Derived1()); 

아니면 클래스 Derived2에 Base1 및 목록에 반환 형식으로 목록을 사용할 수 있습니까? 그건 괜찮을거야.

감사와 안부, Expecto

+0

을 찾기 위해 몰랐다 - 그래서 나는 당신이 당신의 설명에 뭔가 빠져있을 수도 있다고 생각합니다. 어떤 컴파일러 오류가 발생합니까? –

+0

C#은 실제로 다양한 위치에서 공분산을 지원합니다. 그러나 _ 공분산 반환 값 _은 지원되지 않습니다. 실제 문제를 보여주는 것과 관련하여 샘플도 현재 손상되었습니다. – rjnilsson

+0

@RJLohan 영어로하면 sth : "반환 값은 덮어 쓰기 된 메서드 IManager.Load()와 일치하는 ManagableObject 여야합니다. –

답변

0

당신은 새로운 키워드를 사용하여 방법을 선언해야합니다. 내가 무엇을 의미

class Derived2 { 
    new Derived1 foo(); 
}; 
+0

새 수정자를 사용하여 기본 클래스에서 상속 된 멤버를 명시 적으로 숨 깁니다. 상속 된 멤버를 숨기려면 동일한 이름을 사용하여 파생 클래스에서 선언 한 다음 새 수정 자로 수정합니다. (http://msdn.microsoft.com/en-us/library/51y09td4%28v=vs.71%29.aspx#vclrfnew_newmodifier) ​​클래스 기반 {void test() {}} 파생 된 때 사용되는 : base {new void test() {}} (new는베이스 메쏘드를 숨기기 위해서만 사용되며, 새로운 키워드 컴파일러는 경고 메시지만을 생성하지만 코드는 컴파일 및 실행 가능하지 않습니다) – ASpirin

관련 문제