私は、発信者が誰であるかを証明するための秘密シングルトンインスタンスを「キー」として使用して、いくつかの解決策を示しています。
解決方法1:フレンドクラスはシングルトン
public class A
{
private underwear myUnderwear;
public ChangeUnderwear(B friend, underwear newUnderwear)
{
if (friend == null) return;
myUnderwear = newUnderwear
}
}
public sealed class B
{
private B() {};
private B inst;
private MessWithA(A a)
{
a.ChangeUnderwear(this, new Thong());
}
}
誰もが任意の欠陥を参照していますか?このテクニックは、FooクラスとFooManagerシングルトンがある場合に機能します。
解決方法2: 友人がシングルトンでない場合、私はあなたが建設を隠し、すべてのインスタンス隠れの同じ考え使用することができます推測:
interface IB
{ ... }
public sealed class B : IB
{
private B() {};
public IB CreateB()
{
return (IB)new B();
}
private MessWithA(A a)
{
a.ChangeUnderwear(this, new Thong());
}
}
をしかし、今あなたが今、あなたが防ぐために、いくつかの方法が必要ですIBをBにキャスティングするだけで敵を倒し、Aの友だちのみのメンバーにアクセスするためにBを偽装します。何か案は?
解決方法3:シングルトンクラスを使用すると、インスタンスを要求した最初の呼び出し元がそのインスタンスを所有できるようになります。友人クラスは起動時にインスタンスを取得しようとし、他の誰かが最初にそれをつかんだ場合には怒りを吹き飛ばします。
これは私の考えです...しかし、議論のために、インターフェイス実装方法を内部としてマークしようとするとどうなりますか? –
これはインタフェースを実装しなくなり、コンパイル時エラーが発生します。私の答えが実際に問題に対処していることを考えれば、なぜ私の答えが下落したのか分かりません。 –
Jon、あなたは質問の最初の部分を解決しました - これは、クライアントがメソッドを呼び出さないようにします。 2番目の部分:私はこのメソッドをパブリックにしないでください。それ以外の場合は、doxygenはドキュメンテーションにエクスポートして、APIのユーザーを混乱させます。私はあなたに議決権を与えた –