2012-02-08 11 views
3

私はSystem.Web.IHttpHandlerの基本クラスがASP.login_aspxで、その基底クラスがMyCMS.Admin.Loginで、基底クラスが...等であるとしたら、System.Web.UI.Pageに、そしてもちろんobjectに戻ります。キャストせずにベースクラスのメンバーにアクセスできないのはなぜですか?

IHttpHandlerをMyCMS.Admin.Loginとしてキャストしなければ、そのタイプのメンバー以下にアクセスすることができないのはなぜですか?

例:

明確にするために
IHttpHandler result = base.GetHandler(context, requestType, virtualPath, path); 
bool isVisible = result.Visible;//Does not work 
bool isVisible = ((MyCMS.Admin.Login)(result)).Visible;//Works 
//Noting that Visible is a member of System.Web.UI.Page 

、私はresult.Visible 仕事、私はちょうどそれがない理由を知りたい必要があることを期待していませんよ。

+0

投稿の署名に関するよくある質問をご覧ください。 –

+1

あなたは継承ツリーを後方に持っていると思います。 'base'クラスは親クラスです(クラス定義の': 'の後ろにあるものを意味します)。 –

答えて

3

VisibleIHttpHandlerのメンバーではありません。このような変数では呼び出すことはできません。それはPageのメンバー、Controlの方法で、私は信じています。あなたは基本型のいずれかに変数をキャストするとき

/オブジェクトのクラスのインタフェースは、あなただけの変数そのタイプのまたはベースのクラス/インタフェース)のタイプであるメンバーを呼び出すことができます。

+0

Andrewがそれをクリアしてくれてありがとう、それ(そしてあなたの他のコメント)は実際に今多くの意味があります!基本的に、上記の例を使用すると、 'IHttpHandler'を実装している限り、' result'にオブジェクトを割り当てることができますが、オブジェクトのメンバーにアクセスするには、そのオブジェクトを何かにキャストする必要があります。あれは正しいですか? –

+2

最初の部分は正しいです: 'IHttpHandler'を実装した結果への参照を割り当てることができます。しかし、あなたは 'IHttpHandler'のメンバーを使うために他のものにキャストする必要はありません。主に、例えば' ProcessRequest() 'です。 'IHttpHandler'は非常にまばらなインターフェースです。 ProcessRequestとIsReusableを定義するだけです。 IHttpHandlerのリファレンスへのリンクについては、Bernardの答えを参照してください。 –

+0

すばらしい、私はそれを得る!助けてくれてありがとう。あなたの答えを明確にして、ほとんどの人を助けました。 –

1

IHttpHandlerインターフェイスはインターフェイスです。どんなクラスもこのインタフェースを実装できるので、Visibleメンバの知識はありません。あなたがやったことは、Visibleメンバーを継承するクラスのオブジェクトにキャストしています。

+2

IHttpHandlerはインターフェイスなので、これは明確ではありません。そのインタフェースがVisibleというメンバを持っていないからです。 –

+0

良い答え。私は散発的にC#をしばらく使ってきましたが、独学で、私には欠けている基礎知識があります。特にインタフェースに関して。 'result.GetType()。BaseType'が' MyCMS.Admin.Login'を返す理由を説明できますか? –

+1

@IainFraser 'GetType()'は*オブジェクト*が存在する 'Type'を返します。 *変数*はそうではありません。しかし、*変数*の型にあるメンバーだけを呼び出すことができます。 –

関連する問題