私は、後で様々な人が使うことができるライブラリを作っています。クラスの作成方法:特定の(一意の)フィールドを持つオブジェクトを1つだけ作成できます!
class WrapperMoveable
{
IMoveable moveable;
public WrapperMoveable(IMoveable moveable)
{
this.moveable = moveable;
}
}
問題:特定のIMoveableとexaclyつのオブジェクトが存在できることを確認するWrapperMoveableクラスを編集する方法について説明します。誰かが何らかのインターフェースを持つラッパー・オブジェクトを作成しようとしていて、そのインターフェースを持つラッパー・クラスがすでに存在する場合、機構は既存のラッパー・オブジェクトを戻すべきです。
私はいくつかの解決策を持っていますが、最初に問題点を考えてください。
ソリューション:
すべて作成したラッパーオブジェクトが含まれているラッパークラスの静的フィールドを作成します。
class WrapperMoveable { IMoveable moveable; static List<WrapperMoveable> createdWrappers = new List<WrapperMoveable>(); private WrapperMoveable(IMoveable moveable) { this.moveable = moveable; } public static WrapperMoveable CreateWrapper(IMoveable moveable) { if (createdWrappers.Any(e => e.moveable == moveable)) return createdWrappers.First(e => e.moveable == moveable); WrapperMoveable newWrapper = new WrapperMoveable(moveable); createdWrappers.Add(newWrapper); return newWrapper; } }
この方法の問題は、プログラマが新しいキーワードを使用して正常にオブジェクトを作成できないことです。したがって、プログラマは、静的メソッドによってのみオブジェクトを作成できることを知る必要があります。また、参照が常にcreatedWrappersに存在するため、garbridgeコレクターはオブジェクトを解放しません。
ラッパークラスを作成するWrapperFactoryクラスを作成します。前の例のように、プログラマーはラッパーオブジェクトを作成する方法を知っていなければなりません。この解決策では、工場クラスを使用します。
- WrapperMoveableタイプのメモリ内のすべてのオブジェクトをスキャンし、オブジェクトに提供されたインターフェイスが含まれているかどうかを確認します。
あなたの意見ではこの問題のどのような解決策が最適ですか?あなた自身のよりよい解決策がありますか?
投稿体をお読みください! – MaciejLisCK
静的int = 0を作成します。参照カウントとして使用します。カウントがnewwrapperがすでに作成されていることを示している場合は、それを返します。あなたの後に何が望みますか? – Steve