gpt4 book ai didi

c# - 创建 List 的实例,其中类型派生自基类和接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:51 24 4
gpt4 key购买 nike

我有一个类将存储派生自基类并实现接口(interface)的对象。在此示例中,所有类型都派生自 UIElement 并实现我的接口(interface) IDropTarget

所以在我的类里面,我可以以一种奇妙的方式使用泛型类型推断来要求它,而不会将所有内容限制在特定的基类中

public void AddDropTarget<TTarget>(TTarget target)
where TTarget : UIElement, IDropTarget
{
target.DoSomethingAsUIElement();
target.DoSomethingAsIDropTraget();

// Now I want to save it for another method
list.Add(target);
}

public void DoStuff()
{
foreach(var item in list)
{
item.MoreUIElementAndDropStuff();
}
}

不幸的是,我似乎没有办法存储这个 TTarget 限制列表。我不能将它限制为特定类型,因为我已经有多个派生自 UIElement 的类(Rectangle、Button、Grid 等),而且我无法让所有这些对象派生自一个基类型。

我的下一个解决方案是存储每种类型的列表。我需要弄清楚这种开销是否值得,而不是每次使用它们时都强制转换对象。

最佳答案

如果您不想转换,您可以使用装饰器模式的变体创建您需要的公共(public)基类。

//our new base type
public interface IElementAndDropTarget : IDropTarget
{
void DoSomethingAsUIElement();
void MoreUIElementAndDropStuff();
}

// our decorator. We need to store UIElement and IDropTarget
// as different fields. The static "Make" is giving you
// the compile-time guarantee that they both refer
// to the same class
public class UIElementDecorator : IElementAndDropTarget
{
private readonly UIElement t;
private readonly IDropTarget dt;

private UIElementDecorator(UIElement t, IDropTarget dt)
{
this.t=t;
this.dt=dt;
}

public static UIElementDecorator Make<T>(T t) where T: UIElement, IDropTarget
{
return new UIElementDecorator(t,t);
}

public void DoSomethingAsUIElement() {t.DoSomethingAsUIElement();}
public void MoreUIElementAndDropStuff(){t.MoreUIElementAndDropStuff();}
public void DoSomethingAsIDropTarget() {dt.DoSomethingAsIDropTarget();}
}

有了这个,你的列表就可以

public List<IElementAndDropTarget> list = new List<IElementAndDropTarget>(); 

AddDropTarget 中,您可以使用装饰类填充它:

list.Add(UIElementDecorator.Make(target));

就是这样。您的其余代码可以保持不变。

关于c# - 创建 List 的实例,其中类型派生自基类和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20560332/

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