さて、これが私がやりたいことです。
Class Container<T>
{
T contained;
public void ContainObject(T obj)
{
contained = obj;
if(/*Magical Code That Detects If T Implemtns IContainableObject*/)
{
IContainableObect c = (IContainableObject)obj;
c.NotifyContained(self);
}
}
}
interface IContainableObject
{
public void NotifyContained(Container<REPLACE_THIS>);//This line is important, see below after reading code.
}
Class ImplementingType : IContaiableObject
{
public Container<ImplementingType> MyContainer;
public void NotifyContained(Container<ImplmentingType> c)
{
MyContainer = c;
}
}
Class Main
{
public static void Main(args)
{
ImplementingType iObj = new ImplementingType();
Container<ImplementingType> container = new Container();
container.ContainObject(iObj);
//iObj.MyContainer should now be pointing to container.
}
}
基本的に、上記の例を要約すると、タイプTの汎用ラッパータイプがあります。含まれているオブジェクトが特定のインターフェース(このビットは私が行う方法を知っています)
しかし、それはトリッキーになります!なんで?コンテナジェネリックには型が必要だからです。
その重要な行を覚えていますか?
REPLACE_THISがIContainableObjectの場合、インターフェイスのすべての実装者は、NotifyContainedメソッドの実装クラスの名前ではなく、IContainerObjectを使用する必要があります。
明らかな理由から、インターフェイス内のコンテナのタイプとしてImplementingTypeを使用すると、さらに悪化します。
だから私の質問は、REPLACE_THISがインターフェースを実装するオブジェクトのクラスを表すようにするにはどうすればよいですか?