2

別のアセンブリで定義された親から派生した子クラスを持つアセンブリを作成しました。

子への参照を追加すると、Visula Studio では親への参照も追加する必要があります。

その理由と、機能を失わずに防止するにはどうすればよいですか?

4

2 に答える 2

2

あなたが説明することは部分的に可能です。非表示のアセンブリを明示的に参照する必要をなくすことができますが、そのアセンブリはコンパイル時に取り込まれ、実行時に必要になります。

これらのクラスが定義されているとしましょう:

// in assembly 1:
public class A
{
    public virtual void Foo() { }
}

// and in assembly 2:

// requires explicit reference to assembly 1 to use
public class B : A
{
    public override void Foo() { }
    public A Value { get; set; }
    public void Foo(A value) { }
}
// has implicit reference to assembly 1, but end user can ignore
public class C
{
    private A Value { get; set; }
    internal void Foo(A value) { }
    protected internal A Bar() { return new A(); }
}
// usable at runtime even if assembly 1 is missing, as long as you don't call Foo()
public class D
{
    public void Foo() { A blah = new A(); }
    public void Bar() { }
}

エンド ユーザーがクラス B を使用する場合、アセンブリ 1 への明示的な参照が必要になります。A は B のパブリック インターフェイスの一部であるため、B を使用するには、A について知る必要があります。A には 3 つの異なるパブリック参照があり、それらのいずれも、B を使用するために A について知る必要があります。

ただし、クラス C は A への参照を作成しますが、すべての参照はプライベート/内部/ローカルです。A へのすべての参照は外部から隠されているため、エンド ユーザーはアセンブリ 1 について明示的に知る必要はありません。これは実行時に引き続き必要ですが、参照として追加する必要はありません。これは間接参照です。 .

また、エンド ユーザーが B や C を使用せずにクラス D を使用する場合、アセンブリ 1 は、型 A のローカル変数を持つ D.Foo() を呼び出す場合にのみ読み込まれます。実際には D.Bar() を自由に使用できます。実行時にアセンブリ 1 が完全に欠落している場合でも。ただし、D.Foo() を呼び出してアセンブリ 1 が見つからない場合は、例外が発生します。

于 2012-12-07T15:33:48.873 に答える
0

C/C++ では、クラス定義は .h ヘッダー ファイルに存在します。これにより、実装情報を含むソースファイルを必要とせずに、クラスに関する情報を参照することができます (たとえば、そのクラスから継承したい場合など)。欠点は、コードの重複です (.cpp ファイルでの実装では、.h ファイル内のほとんどの情報を繰り返す必要があります)。

.NET の世界では設計が異なります。アセンブリには、クラスのコード (CLR バイトコード) と、そのクラスからの継承などに必要なすべてのメタデータ (クラス名、そのメンバーに関する情報など) の両方が含まれます。

その設計の結果、アセンブリ B のクラスから継承するアセンブリ A で定義されたクラスを使用するために、.NET では A アセンブリと B アセンブリの両方が必要になります。または、より一般的に: 特定のアセンブリ (クラス、列挙型、構造体) から直接または間接的に何かを使用する場合は、そのアセンブリを参照する必要があります。

何を防ぎたいのかわからない。説明したようにコードを 2 つのアセンブリに分割する場合、両方を参照する必要はありません。

もちろん、コードを構造化するさまざまな方法がありますが、そもそもコードを 2 つのアセンブリに分割することで達成しようとしている目標がわからないため、有用な提案を行うことは不可能です。

于 2010-07-13T10:03:55.850 に答える