Хорошо, вот что я хотел бы сделать.Самостоятельная ссылка в интерфейсах
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.
Использование варианта реализации в качестве типа контейнера внутри интерфейса еще хуже по очевидным причинам!
Итак, мой вопрос: что мне делать, чтобы REPLACE_THIS представлял класс объекта, реализующего интерфейс?
Спасибо очень! Работает как шарм :) –
Вы можете избежать кастинга, если объявите общее ограничение для T. –
К сожалению, я только что заметил опечатку в моем примере кода, заметив, что вы создали пустой интерфейс для IContainerObject - I Случайно типизированный IContainer, который не может быть доступен IC. Означает ли это, что ваш интерфейс IContainer можно просто удалить? –