2012-09-23 4 views
4

다른 인터페이스의 메서드에서 인터페이스 또는 추상 클래스를 "out"매개 변수로 사용하려면 어떻게해야합니까? 다른 인터페이스에서 out 매개 변수로 인터페이스를 사용할 수 없으면 실제로 메서드를 호출 할 때 해당 인터페이스를 구현하는 클래스를 수락해야합니까?C에서 인터페이스를 "out"매개 변수로 사용

bool을 반환하고 "Response"개체를 채우는 메서드가있는 Transaction 인터페이스가 필요하지만 해당 응답 개체는 Transaction 인터페이스의 모든 구현마다 서로 다른 파생 개체입니다. 미리 감사드립니다.

namespace csharpsandbox 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     TransactionDerived t = new TransactionDerived(); 
     t.Execute(); 
    } 
} 


public interface ITransaction 
{ 
    bool Validate(out IResponse theResponse); 
} 

public interface IResponse { } 



public class ResponseDerived : IResponse 
{ 
    public string message { get; set; } 

} 

public class TransactionDerived : ITransaction 
{ 
    public bool Validate(out IResponse theResponse) { 

     theResponse = new ResponseDerived(); 
     theResponse.message = "My message"; 
     return true; 
    } 

    public void Execute() 
    { 
     ResponseDerived myResponse = new ResponseDerived(); 

     if (Validate(out myResponse)) 
      Console.WriteLine(myResponse.message); 
    } 
} 
} 

답변

5

현재 구현은 당신이 적절하게 물건을 주조로 작동합니다 :이 지저분

public class TransactionDerived : ITransaction 
{ 
    public bool Validate(out IResponse theResponse) 
    {  
     theResponse = new ResponseDerived(); 
     ((ResponseDerived)theResponse).message = "My message"; 

     return true; 
    } 

    public void Execute() 
    { 
     IResponse myResponse; 

     if (Validate(out myResponse)) 
      Console.WriteLine(((ResponseDerived)myResponse).message); 
    } 
} 

그러나. 대신 일반적인 인터페이스를 사용하여 캐스팅을 방지 할 수 있습니다

public interface ITransaction<T> where T : IResponse 
{ 
    bool Validate(out T theResponse); 
} 

public class TransactionDerived : ITransaction<ResponseDerived> 
{ 
    public bool Validate(out ResponseDerived theResponse) 
    {  
     theResponse = new ResponseDerived(); 
     theResponse.message = "My message"; 

     return true; 
    } 

    public void Execute() 
    { 
     ResponseDerived myResponse; 

     if (Validate(out myResponse)) 
      Console.WriteLine(myResponse.message); 
    } 
} 
+0

이것은 훌륭한 솔루션처럼 보이고 테스트를 거쳐 곧 내가 필요한 것을 수행하는지 확인합니다. 감사합니다! – ARW

+0

나는 각 트랜잭션 구현이 실제로 여러 개의 고유 한 응답을 가질 수 있기 때문에 이것이 제대로 작동하지 않을 것이라는 것을 깨달았습니다 ... 내 최선의 방법은 다음에 던지기가 될까요? – ARW

+0

시스템의 나머지 부분을 보지 않고서는,'as' 연산자를 사용하면 캐스팅이 좀 더 깔끔해질 것입니다.)하는 것이 가장 쉬운 방법입니다. 그러나주의 깊으십시오. 유형을 검사하고 많은 것을 캐스팅해야하는 경우 일반적으로 디자인에 더 큰 문제가 있음을 나타냅니다. – verdesmarald

1

빈 인터페이스 정의 (here 참조) 무의미하다. 대신 다음과 같이 시도하십시오.

public interface ITransaction 
{ 
    bool Validate(out object theResponse); 
} 

다음 개체를 적절하게 캐스팅하십시오.

+0

Downvoter이 인터페이스의 소비자가 출력 매개 변수에 대한 계약이없는 것을 의미 사용 –

+0

을 언급해야한다. 그들은 무엇을 기대해야하는지 어떻게 알 수 있습니까? –

+0

인터페이스의 구현. 인터페이스 유형이 x 인 경우 응답 유형은 y입니다. 어쨌든 IResponse 구현을 사용하여 메서드 나 속성을 호출해야하므로 어딘가에서 파생해야합니다. –