2009-05-22 15 views
101

対私は、コードのこの作品を見た:C#のHttpWebRequest WebRequestクラス

var request = (HttpWebRequest) WebRequest.Create("http://www.google.com"); 

をなぜあなたは(HttpWebRequest)をキャストする必要がありますか?単にHttpWebRequest.Createを使用しないのはなぜですか?そして、HttpWebRequest.CreateはなぜWebRequestになるのですか?HttpWebRequestではありません。

+0

ポスト関連:http://stackoverflow.com/q/8209781/274502 – cregox

答えて

130

Createのメソッドは静的であり、WebRequestにのみ存在します。 HttpWebRequest.Createと呼ぶと違って見えるかもしれませんが、実際にはWebRequest.Createという名前にコンパイルされています。継承のため、HttpWebRequestにしか見えません。

Createメソッドは内部的に、ファクトリパターンを使用して、オブジェクトの実際の作成を行います。Uriに渡します。 Uriに応じて、FtpWebRequestまたはFileWebRequestのような他のオブジェクトを実際に返すことができます。

+3

これは正しいです。 HttpWebRequest.CreateまたはHttpWebRequest.CreateHttpのようなものからHttpWebRequestをキャストせずに取得する方法があればうれしいでしょう。最初のものは、新しいpublic static HttpWebRequest Create(string url)のようなものです。いずれにしても、URLがHTTPでない場合は、InvalidArgumentExceptionがスローされます。 –

+4

.NETクリエイターによる非常に奇妙なデザインの決定(私は間違っていると思いませんか? –

+2

@ I.J.Kennedy私は、非常に奇妙で非論理的で実用的でない設計決定に完全に同意します。 – Aidiakapi

27

WebRequestは抽象クラスで、ファクトリメソッドCreateを持ち、渡されたURLに応じて具象サブクラスのインスタンスを作成します。あなたの代わりに ​​の HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);を必要とするか、したいかどうかは、あなたのニーズに、そしてあなたが渡したURLの種類に依存

あなたが唯一のHTTPに渡す場合:URLの場合、元のコードでは、あなたはプロパティにアクセスすることを可能にし、サブクラスHttpWebRequestは基本クラスWebRequestで定義されているメソッドに加えて実装されています。 FTP:URLを渡した場合、HttpWebRequestへのキャストは失敗します。

後者は一般的なものであり、サポートされているURLのいずれのタイプでも失敗することはありませんが、サブクラスにキャストすることなく、基本クラスが定義するプロパティとメソッドにしかアクセスできません。

は - あなたはHttpWebRequestのに固有のメンバーへのアクセスを必要とする場合マーティンHonnen

10

経由でキャストが必要なだけです。 WebRequestでサポートされているプロパティ/メソッドで十分であれば、さまざまなタイプのリクエスト/応答プロトコルに対して動作するアプリケーションを作成できます。この場合、URIは、プラグ可能なプロトコルでサポートされている任意のプロトコルを使用してユーザーが指定するものです。元のソフトウェアを変更せずに新しいプロトコルをサポートすることもできます。

アプリケーションで特定のプロトコル固有の機能をさらに制御する必要がある場合は、requestUriをサポートされているスキームに制限し、WebRequestを適切なプロトコル固有のサブクラスにキャストできます。これにより、アプリケーションでサポートされるプロトコルが制限されますが、プロトコル固有の機能を調整することができます。

関連する問題