ライブラリを作成している場合は、プライベート/内部クラスを使用してパブリックインターフェイスを定義できます。読み取り専用クラスのインスタンスを外部コンシューマーに返す必要があるメソッドは、代わりに読み取り専用インターフェイスのインスタンスを返す必要があります。現在、具体的なタイプへのダウンキャストは、そのタイプが公開されていないため不可能です。
ユーティリティライブラリ
public interface IReadOnlyClass
{
string SomeProperty { get; }
int Foo();
}
public interface IMutableClass
{
string SomeProperty { set; }
void Foo( int arg );
}
あなたの図書館
internal MyReadOnlyClass : IReadOnlyClass, IMutableClass
{
public string SomeProperty { get; set; }
public int Foo()
{
return 4; // chosen by fair dice roll
// guaranteed to be random
}
public void Foo( int arg )
{
this.SomeProperty = arg.ToString();
}
}
public SomeClass
{
private MyThing = new MyReadOnlyClass();
public IReadOnlyClass GetThing
{
get
{
return MyThing as IReadOnlyClass;
}
}
public IMutableClass GetATotallyDifferentThing
{
get
{
return MyThing as IMutableClass
}
}
}
これで、を使用する人は誰でも、SomeClass
2つの異なるオブジェクトのように見えるものを取り戻すことができます。もちろん、リフレクションを使用して基になるタイプを確認することもできます。これにより、これは実際には同じタイプの同じオブジェクトであることがわかります。ただし、そのタイプの定義は、外部ライブラリではプライベートです。この時点で、まだ技術的に定義を取得することは可能ですが、それを実行するにはヘビーウィザードリーが必要です。
プロジェクトによっては、上記のライブラリを1つにまとめることができます。それを妨げるものは何もありません。権限を制限するDLLに上記のコードを含めないでください。
コメントはXKCDの功績によるものです。