2013-12-09 3 views
1

인터페이스의 계층 구조가 IBaseThing<T>IChildThing:IBase<ChildThing> 인 경우를 가정 해 보겠습니다.인터페이스 상속 및 추상 메서드 재정의

internal abstract class Base<T> 
{ 
    public abstract IBaseThing<T> Thing {get;} 
} 

internal class Concrete:Base<ChildThing> 
{ 
    public override IChildThing Thing 
    { 
     get 
     { 
      return GetChildThing(); 
     } 
    } 
} 

은 무엇 일어날 것은 짖는 소리입니다 :

'콘크리트'구현하지 않습니다 상속 추상적 회원 '자료 은 또한이 같은 두 개의 클래스가 있습니다. '

나는 클래스 전체에 (IChildThing)this.Thing 캐스팅을 건너 뛰고 싶습니다. 내가해야 할 일은 무엇입니까? 당신은 할 수 없습니다

public interface IBaseThing {} 

public interface IChildThing : IBaseThing {} 

internal abstract class Base<T> where T : IBaseThing 
{ 
    public abstract T Thing {get;} 
} 

internal class Concrete:Base<IChildThing> 
{ 
    public override IChildThing Thing 
    { 
     get 
     { 
      return GetChildThing(); 
     } 
    } 

    public IChildThing GetChildThing() 
    { 
     // Your impelementation here... 
     return null; 
    } 
} 
+0

'IChildThing : IBase '은 믿어지지 않는 냄새가 나는 인터페이스입니다. 'ChildThing : IBase '.. .. 그러길 바랍니다. – nawfal

+0

잘못된 가정 nawfal. IThings는 T가 아닙니다. –

+0

Reza는 완벽한 예제 (아직 필요한 것만)와 유스 케이스를 게시합니다. 우리는 당신을 더 잘 도울 수 있습니다. 그렇지 않으면 그것의 모든 가정. – nawfal

답변

2

:

+0

지금 'Thing' 속성 사용법을 이해할 수 없습니다! 다른 클래스에서 액세스 할 수있는 속성으로 Thing을 선언하고 있습니다. 내부적으로 이것은 효과적이지만, 사실 당신은 부동산 철학을 무시했습니다. 권리? –

+1

"재산 철학"을 무시한다는 것은 무엇을 의미합니까? 나는 네가 의미하는 것에 익숙하지 않다. –

+0

다른 클래스에 get 및 set을 제공하는 속성을 지정합니다. 즉, private 속성이 합리적이지 않은 대신 개인 필드를 사용할 수 있습니다. 귀하의 솔루션에서 IBaseThing 사물은 다른 클래스의 IChildThing으로 사용할 수 없습니다. –

2

이 솔루션을 사용해보십시오. 타입 시스템은 겹쳐 쓰는 클래스에서 메소드 타입을 변경하려고 시도하는 것을 반대합니다. IChildThing은 IBaseThing에서 파생 될 수 있지만 동일한 것은 아닙니다. 예를 들어 나중에 IChildThing에 몇 가지 메소드를 추가 할 수 있습니다. 그런 다음 한 클래스 (Concrete)는 기본 클래스와 다른 서명으로 반환 된 객체를 약속합니다. 이는 유형 오류입니다. 당신이 가진 모든 비록 자료의 경우

internal class Concrete : Base<ChildThing> 
{ 
    public override IBaseThing<ChildThing> Thing 
    { 
     get { return ChildThing; } 
    } 

    public IChildThing ChildThing { get; set; } 
} 

, 당신은 안전하게 IChildThing 얻을 수 없습니다와 같은 것에 대해 어떻게

당신이 어떤 경우에 IChildThing을 참조해야하는 경우

. 이것이 바로 이와 같은 강력한 유형의 시스템의 특성입니다. 그게 문제라면, 당신이 좀 더 구체적인 예를 든다면 그 문제를 피하기 위해 구조 조정 방법을 제안 할 수있을 것입니다.

+0

이 컴파일됩니까? 나는 잘 모르겠다. – nawfal

+2

질문과 똑같지 않니? –

+0

이것은 정확하게하고 싶은 일이지만 위의 오류가 있습니다. –

관련 문제