2016-10-10 9 views
1

なぜHttpContextは抽象クラスであり、インターフェイスではないのですか?なぜHttpContextはインターフェイスではなく抽象クラスですか?

クラスはpublic abstractであり、すべてのメソッドはpublic abstractです。私はこのクラスが抽象クラスである理由を理解していません。

インタフェースではなく抽象クラスである理由は何ですか?

+2

このような設計上の質問は、標準的な情報源がなければ答えるのが難しいので、ASP.NETチームの誰かが答えて答えることができない限り、大きな意見です。それは、開発者のためのインターフェイス契約を破ることなく(インターフェイスに新しいメンバを追加し、すべてがコンパイルを停止する)、メンバをインターフェイスに追加することができないからです。抽象クラスでは、オプションで実装できる 'virtual'メンバを追加できます。 ASP.NETチームはこのパターンをいくつかの場所で採用しています。 – vcsjones

+1

通常、抽象基本クラスには、サブクラス実装が活用できるデフォルト(すなわちユーティリティ)または部分実装が含まれていますが、インタフェースではその要素を「ハングアップ」する場所はありません。このように、カスタマイズされた実装を「スピンアップ」する方が簡単です。すべてのメソッドが仮想であっても、ドアはまだ開かれているので、サブクラスの部分/ヘルパー実装の「レイヤー」を構築できます。 –

+0

@ escape-llc確かに。しかし、この場合はそうではありません。それで私は不思議に思った... – Fred

答えて

1

これは、ASP.NET Coreを使用しているMicrosoftのDaniel Rothからの返信です。

抽象クラスを使用すると、将来のバージョンでメンバーを追加できますが、これはインターフェイスではできません。

0

このトピックに関する多くの意見があります(たとえば、hereおよびhere)。私はHttpContextクラスを変更することを期待しないでください


をバージョン管理:ASP.NETチームは、通常のインターフェイスを使用していても、私は彼らがこのような場合には、抽象クラスのために選んだ理由をいくつかの理由を考えることができますこれらは部分的にvirtualキーワードを使用して実装できるため、抽象クラスはインタフェースよりも簡単です(バージョンは実際にはバージョン化されません)。

カプセル化は、抽象クラスはインターフェイスは、特定の機能のための契約の多くを提供する機能のセットをカプセル化します。クラスは、DefaultHttpContextのようなHttpContextの実装には意味をなされる1つの抽象クラスしか実装できません。

後方互換性
ASP.NETコアは、ASP.NETを完全に書き直したものですが、開発者は、年間のHttpContextクラスに対してプログラムするために使用されています。どちらのクラスも多くの特性を共有しています。


ここで私はちょうど推測していることに気付くでしょう。おそらくASP.NETチームの人々が私たちを啓発するかもしれません。

関連する問題