4

必要な参照が欠落しているとコンパイラーが文句を言っているシナリオがあります。

私は3つのアセンブリを持っています:

  • A.DLL

    • パブリッククラスBaseClass
  • B.DLL(参照A.DLL

    • パブリッククラスDerivedClass:BaseClass
  • C.DLL

    var派生=新しいDerivedClass();

C.DLLでは、B.DLLのみを参照しています(DerivedClassにのみアクセスする必要があります)。

コンパイラは、A.DLLも参照する必要があるというエラーを出します。

これによりカプセル化が完全に破られ、なぜこれが必要なのかわかりません(B.DLLはA.DLLを参照しているため)。

編集:「カプセル化を破る」という言葉の間違った選択。私の意図は、A.DLLからではなく、B.DLLからのみ型をインスタンス化しているため、このプロジェクト(C.DLL)に追加のコンパイル時の制約があるように見えることです。

主にBとCが同じソリューションに含まれているため、このコンパイル時の要件を削除したいと思いますが、Aはそうではありません。

4

2 に答える 2

7

これによりカプセル化が完全に破られ、なぜこれが必要なのかわかりません(B.DLLはA.DLLを参照しているため)。

それがどのように「カプセル化を完全に破る」のかわかりません。

メンバー解決を実行するために、コンパイラーはに何が含まれているかを知る必要がありますBaseClass。したがって、C.dllをコンパイルするには、A.dllとB.dllの両方への参照が必要です。誰かがのインスタンスにアクセスするコードを書いているとき、それ自体がオーバーライドするもののスーパーセットである可能性が高いため、サポートするDerivedClassものを知る必要があります。BaseClassDerivedClass

気に入らなくても、それがそのままです。コンパイル時にA.dllが必要にならないようにする場合は、継承の代わりにコンポジションを使用できますが、実行時にA.dllが必要になります。

于 2012-07-23T07:23:25.863 に答える
2

Blockquoteこれはカプセル化を完全に破り、なぜこれが必要なのかわかりません(B.DLLはA.DLLを参照しているため)。

この言葉の選択を修正したようですが、あなたの意味は理解できたと思います。AがB経由でのみCを使用できるようにする場合は、AからCではなくBを参照する必要があります。

コンパイラはBとCの両方を使用する必要があることは理解していますが、AからBへの参照とBからCへの参照に基づいて解決できない理由がわかりません。 「BはCに依存している」と「AはBに依存している」と言ったので、AもCに依存していると推測できます。

ビルドが依存関係グラフに従って型を解決できる場合、参照を使用して特定のコードの階層化を実施する場合は常に、インターフェースに頼る必要はないように思われます。他にどうすればいいのかわかりませんが、本当に1つの実装が必要な場合、インターフェースはただの負担なので、このようなことが可能だったらいいのにと思います。

于 2013-10-14T13:15:11.417 に答える