同じアセンブリ内の型から継承できるが、アセンブリの外部からは継承できない型を作成したい。タイプをアセンブリの外部に表示したいのですが。
これは可能ですか?
コンストラクターを内部にすることができます:
public class MyClass
{
internal MyClass() { }
}
基本クラスから派生するすべてのクラスは、そのコンストラクターで基本クラスのコンストラクターを呼び出す必要があります。基本クラスが別のアセンブリにある場合はコンストラクターを呼び出すことができないため、派生クラスはコンパイルされません。
この質問は、意味的に正しい答えからまだ恩恵を受けることができると思います...それは「いいえ」です。タイプを「外部アセンブリのみにシール」として宣言することはできません。
誤解しないでください。dtbの答えは良いものです。内部コンストラクターは、目的の結果から取得できる最も近いものです。
ただし、これを読んでいる人は、この例でMyClass
は実行時に封印されているとは説明されていないことに注意する必要があると思います。これが問題になる可能性は低いですが、(コードまたはサードパーティライブラリからの)リフレクションに基づくロジックがこの特定のタイプで異なる動作をする可能性がある場合。それは覚えておくべきことです。
そして今、dtbのサンプルコードをさらに拡張するには:
public class MyClass
{
internal MyClass() { }
// This factory method will be accessible from external assemblies, making your class instantiable yet still "sealed"
public static MyClass Create()
{
return new MyClass();
}
}
MyClass
このようにして、継承の制御を維持しながら、所有するアセンブリの外部からインスタンスを作成できます。