9

ASP.NET MVC3 のソース コードを読んでいるときに、 ControllerBaseのコード内に次のようなものを見つけました。

public interface IController
{
    void Excecute(RequestContext requestContext);
}


public abstract class ControllerBase : IController
{

    protected virtual void Execute(RequestContext requestContext)
    {
        if (requestContext == null)
        {
            throw new ArgumentNullException("requestContext");
        }
        if (requestContext.HttpContext == null)
        {
            throw new ArgumentException(MvcResources.ControllerBase_CannotExecuteWithNullHttpContext, "requestContext");
        }

        VerifyExecuteCalledOnce();
        Initialize(requestContext);

        using (ScopeStorage.CreateTransientScope())
        {
            ExecuteCore();
        }
    }

    void IController.Execute(RequestContext requestContext)
    {
        Execute(requestContext);
    }
}

ControllerBase は の実装をExecute提供しますが、定義を提供するものがありますIController.Execute

なぜこれが行われ、何を達成するのでしょうか? 何の役にも立たないようです。

4

3 に答える 3

2

MSDN ドキュメントによると、明示的なインターフェイス メンバーの実装の目的の 1 つは次のとおりです。「明示的なインターフェイス メンバーの実装は、クラスまたは構造体のインスタンスを介してアクセスできないため、クラスまたは構造体のパブリック インターフェイスからインターフェイスの実装を除外できます。これは特に便利です。クラスまたは構造体が、そのクラスまたは構造体の消費者にとって重要ではない内部インターフェースを実装する場合。」

上記の私の解釈が正しい場合、型を持つ変数は保護されているためControllerBase、呼び出しに使用できません。Execute変数の型は でなければなりませんIController。これが構成の意図であるかどうかはわかりませんが、これが理由のように感じます。

関連するテストでは、 を呼び出す前にControllerBase変数を明示的にキャストしています。IControllerExecute

于 2012-04-12T21:51:00.397 に答える