私はこのコードを見ました:
var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");
(HttpWebRequest)
をキャストする必要があるのはなぜですか?なぜHttpWebRequest.Create
を使用しないのですか?そして、なぜHttpWebRequest.Create
はWebRequest
ではなくHttpWebRequest
を作成するのですか?
Create
メソッドは静的であり、WebRequest
にのみ存在します。 HttpWebRequest.Create
は異なって見えるかもしれませんが、実際にコンパイルしてWebRequest.Create
。継承のためHttpWebRequest
にあるように見えます。
Create
メソッドは内部で、渡されたUri
に基づいて、ファクトリパターンを使用してオブジェクトの実際の作成を行います。実際には、FtpWebRequest
に応じて、FileWebRequest
またはUri
などの他のオブジェクトを取得できます。
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経由
キャストは、HttpWebRequestに固有のメンバーにアクセスする必要がある場合にのみ必要です。 WebRequestでサポートされているプロパティ/メソッドが十分であれば、多くの種類の要求/応答プロトコルに対して機能するアプリケーションを作成できるという考え方です。この場合、URIは、プラグ可能なプロトコルでサポートされている任意のプロトコルを使用してユーザーが指定したものになります。元のソフトウェアを変更せずに、新しいプロトコルをサポートすることもできます。
アプリケーションが特定のプロトコルに固有の機能をさらに制御する必要がある場合、requestUriをサポートされているスキームに制限し、WebRequestを適切なプロトコル固有のサブクラスにキャストできます。これにより、アプリケーションでサポートされるプロトコルが制限されますが、プロトコル固有の機能を微調整できます。