Самостоятельная ссылка в интерфейсах

Хорошо, вот что я хотел бы сделать.

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, то все разработчики интерфейса должны использовать IContainerObject, а не имя реализующего класса в своем методе NotifyContained.

Использование ImplementingType в качестве типа контейнера в интерфейсе еще хуже по очевидным причинам!

Итак, мой вопрос: что мне сделать, чтобы REPLACE_THIS представлял класс объекта, реализующего интерфейс?

5
задан Brian Rasmussen 19 May 2012 в 23:32
поделиться