gpt4 book ai didi

c# - 接口(interface)中的自引用

转载 作者:太空狗 更新时间:2023-10-29 23:16:53 25 4
gpt4 key购买 nike

好的,这就是我想做的。

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 的通用包装器类型。我希望包装器类型通知它所包含的任何内容它正在被包含(带有它自己的副本!)如果包含的对象实现了特定的接口(interface)(这一点我知道该怎么做)

但它变得棘手!为什么?好吧,因为容器泛型需要有一个类型。

还记得那句重要的话吗?

如果 REPLACE_THIS 是 IContainableObject,则该接口(interface)的所有实现者都必须使用 IContainerObject,而不是其 NotifyContained 方法中的实现类的名称。

使用 ImplementingType 作为接口(interface)内容器的类型更糟糕,原因很明显!

所以我的问题是,我该怎么做才能使 REPLACE_THIS 代表实现该接口(interface)的对象的类?

最佳答案

class Container<T>
{
T contained;
public void ContainObject(T obj)
{
contained = obj;
var containable = obj as IContainableObject<T>;
if(containable != null)
{
containable.NotifyContained(this);
}
}
}

interface IContainableObject<T>
{
void NotifyContained(Container<T> c);
}

class ImplementingType : IContainableObject<ImplementingType>
{
public Container<ImplementingType> MyContainer;
public void NotifyContained(Container<ImplementingType> c)
{
MyContainer = c;
}
}

编辑:添加具有通用约束的版本

interface IContainer<T>
{
void ContainObject(T obj);
}

class Container<T> : IContainer<T> where T : IContainableObject<T>
{
T contained;

public void ContainObject(T obj)
{
contained = obj;
contained.NotifyContained(this);
}
}

interface IContainableObject<T>
{
void NotifyContained(IContainer<T> c);
}

class ImplementingType : IContainableObject<ImplementingType>
{
public IContainer<ImplementingType> MyContainer;

public void NotifyContained(IContainer<ImplementingType> c)
{
Debug.WriteLine("notify contained");
MyContainer = c;
}
}

关于c# - 接口(interface)中的自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10668629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com