5

インターフェイスまたは抽象クラスを別のインターフェイスのメソッドの「out」パラメータとして使用するにはどうすればよいですか?インターフェイスを別のインターフェイスのoutパラメータとして使用し、実際にメソッドを呼び出すときに、そのインターフェイスを実装するクラスを受け入れるようにすべきではありませんか?

boolを返し、「Response」オブジェクトにデータを設定するメソッドを持つTransactionインターフェースが必要ですが、そのresponseオブジェクトは、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);
    }
}
}
4

2 に答える 2

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);
    }
}
于 2012-09-23T14:47:14.623 に答える
1

空のインターフェース定義は無意味です(ここを参照)。代わりに、次のようなものを試してください。

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

次に、オブジェクトを適切にキャストします。

于 2012-09-23T14:43:23.077 に答える