2010-06-30 5 views
2

그래서 여기가 코드 지원 C의 메소드로 리디렉션됩니다. 그러나 IoC와 CSLA를 지원하려면이 방법이어야합니다. 그래서 내가 찾고있는 것은 D를 저장하여 인터페이스 서명과 일치하도록 T를 반환하는 것입니다.인터페이스 선언은 IOC의

나는 잠시 동안 이것을보고 있었고 내가 무엇인지 알 수없는 것처럼 보입니다. 있어야 할 곳에 없는.

답변

1

좋아, 그럼 난 내 예제에 있던 나쁜 코드에 대해 사과하고 싶다. 그러나 바라건대 잠시 쳐다 보면서 그것이 잘못되었다는 것을 알 수있었습니다. 그러나 여기에 내가 생각해 낸 대답이 있습니다. 변환에 더 나은 방법이있을 것이라고 생각하지만, CSLA 핵심 구성 요소이며 변경하고 싶지 않은 BusinessBase 클래스를 변경하지 않아도되는 솔루션을 원했습니다. 여기에 노력하고 내가 그와 함께 온 코드입니다 : 만든

interface A<T> 
{ 
    T Save(); 
} 

interface IConcreteInterface : A<IConcreteInterface> 
{ 
} 

class BusinessBase<T> 
    where T : BusinessBase<T> 
{ 
    public T Save() 
    { 
     return (T)this; 
    } 
} 

class D<T, U> : BusinessBase<T> 
    where T : BusinessBase<T>, A<U> 
    where U : A<U> 
{ 
    public new U Save() 
    { 
     return (U)(object)base.Save(); 
    } 
} 

class ConcreteClass : D<ConcreteClass, IConcreteInterface>, IConcreteInterface 
{ 
} 

변경이 작업이었다이 : 리턴 (U) (객체) base.Save();

필자는 샘플에서 (U) 캐스트를 넣지 않았기 전에 그런 식으로 컴파일하지 않기 때문에. 결정될 수있는 T와 U 사이에는 아무 관계도 없기 때문입니다. 따라서이 문제를 해결하는 유일한 방법은 T에서 Save로 (개체) T를 캐스팅하는 것입니다. 물론이 개체는 물론 모든 것에 캐스팅 할 수 있습니다.

주의 캐스팅 오류에 대한 약간의 추가 보호를 위해 유형 제약 조건을 추가했습니다. T가 A 유형이고 U 유형이 A인지 확인 중이므로 두 유형 모두 동일한 인터페이스를 갖습니다.

누군가가 더 예쁜 것을 가지고 있으면 제안에 대해 개방적입니다. 그러나 지금은 이것이 작동하고 있으며 그것에 대해 다소 기분이 좋습니다. 내가 할 수있는 일은 최소한 T를 구현해야한다는 것입니다. 예쁘지 않아서 조금 더 시행 할 수 있습니다.

1

은 당신이 필요할 것 같은데요 :

class BusinessBase<T> : B 
{ 
    T Save(); 
} 

과 :

class D<T, U> : BusinessBase<T> 
    where T : BusinessBase<T> 
    where U : B<U> 
{ 
    new U Save() 
    { 
     return base.Save(); 
    } 
} 

난 당신이 BusinessBase<T>.Save()B<U> 사이에 묵시적 또는 명시 적 연결이 없기 때문에 오류가 생각하는 당신 돌아 오려고하는거야. 이것이 가능한가, 아니면 다른 인터페이스를 깨뜨릴 것인가?

CSLA 프레임 워크를 다루는 Expert C# 2008 Business Objects를 보았습니까?

+0

아니요. 저 책이 없습니다. 나는 그 사본을 얻을 수 있는지 알아봐야 할 것이다. 하지만 둘 사이에 정의 된 연결이 없다는 것은 맞습니다. T의 BusinessBase 과 B 의 U 사이에 연결이 있지만. U는 T가 구현 한 인터페이스입니다. 그 관계를 통해 내가 바라본 뭔가가 있었으면 좋겠다. – spinon

관련 문제