web-dev-qa-db-ja.com

C#HttpWebRequestとWebRequest

私はこのコードを見ました:

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

(HttpWebRequest)をキャストする必要があるのはなぜですか?なぜHttpWebRequest.Createを使用しないのですか?そして、なぜHttpWebRequest.CreateWebRequestではなくHttpWebRequestを作成するのですか?

108
Unknown

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

Createメソッドは内部で、渡されたUriに基づいて、ファクトリパターンを使用してオブジェクトの実際の作成を行います。実際には、FtpWebRequestに応じて、FileWebRequestまたはUriなどの他のオブジェクトを取得できます。

131
David Wengier

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

HTTP:URLのみを渡す場合、前のコードを使用すると、基本クラスHttpWebRequestで定義されたものに加えて、サブクラスWebRequestが実装するプロパティとメソッドにアクセスできます。ただし、FTP:URLを渡した場合、HttpWebRequestへのキャストは失敗します。

後者は汎用であり、サポートされているURLの種類では失敗しませんが、もちろんサブクラスにキャストしないと、ベースクラスが定義するプロパティとメソッドにしかアクセスできません。

-Martin Honnen経由

30
Orhan Cinar

キャストは、HttpWebRequestに固有のメンバーにアクセスする必要がある場合にのみ必要です。 WebRequestでサポートされているプロパティ/メソッドが十分であれば、多くの種類の要求/応答プロトコルに対して機能するアプリケーションを作成できるという考え方です。この場合、URIは、プラグ可能なプロトコルでサポートされている任意のプロトコルを使用してユーザーが指定したものになります。元のソフトウェアを変更せずに、新しいプロトコルをサポートすることもできます。

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

11
Kevin