gpt4 book ai didi

c# - "Combined Type"- 泛型 - 其他东西?

转载 作者:行者123 更新时间:2023-11-30 17:48:20 25 4
gpt4 key购买 nike

我感觉失去了我的 OO 知识。实际上,问题看起来很简单:我想创建一个类,它对一个对象进行操作

  • 继承自 System.Windows.Forms.Form
  • 实现接口(interface) IDescribedActionsProvider

同时。

我可以创建一个新的表单类型公共(public)抽象类 SpecialForm : Form, IDescribedActionsProvider并需要该 SpecialForm 类型的参数。

但是这里不行:我们大部分的Form继承自OurCompanyForm,不需要实现IDescribedActionsProvider,有的Form不继承,但是在实现接口(interface)的时候,应该是可以接受的参数。这里需要的是组合,而不是继承

然后我想到了泛型。我可以像这样定义我的类(class)

public class FormController<T> : IDisposable where T : Form, IDescribedActionsProvider
{
T _ControlledForm;
OtherType _OtherObject;

internal FormController(OtherType otherObject, T controlledForm)
{
_OtherObject = otherObject;
_ControlledForm = controlledForm;
....
}

它会按照我的预期工作,但感觉完全不对:这不是泛型(参见 http://msdn.microsoft.com/en-us/library/sz6zd40f%28v=vs.100%29.aspx 处的 MSDN)的目的。当我想在工厂中创建 FormController 对象(因为在那里创建的 OtherType)时,我遇到了问题,它不是通用的,即像这样的函数公共(public) FormController CreateFormcontroller(T controlledForm)不可能,因为 T 未在此处定义...并且由于组合与继承的关系,使用“SpecialForm”而不是 T 不起作用。

你有什么建议? “鸭子打字”——但这也不是一个好的 OO 实践?

编辑:

传递给FormController的对象必须是这两种类型,因为它描述了Form的事件并调用了接口(interface)的方法。

如 Boris B. 的评论和 Weyland Yutani 的回答中所述,在工厂方法中定义 T。

但我仍然怀疑在这种情况下使用泛型:T controlledForm 参数是单个对象,在 FormController 类中只有该“类型”的一个实例,具体类型无处不在 -这与例如明显不同一个列表 。我并不“需要”一个 FormController 对象,只需要一个 FormController(恰好在该表单上工作)。

最佳答案

“当我想在工厂中创建 FormController 对象(因为在那里创建的 OtherType)时,我遇到了问题,它不是通用的,即像 public FormController CreateFormcontroller(T controlledForm) 这样的函数是不可能的,因为 T此处未定义...”

我可能搞错了,但你不能只在工厂方法上定义 T 吗?

class Factory
{
public static FormController<T> CreateFormController<T>(T controlledForm) where T : Form, IDescribedActionsProvider
{
return new FormController<T>(new OtherType(), controlledForm);
}
}

class FormController<T> where T : Form, IDescribedActionsProvider
{
T _ControlledForm;
internal FormController(OtherType otherObject, T controlledForm)
{
_ControlledForm = controlledForm;
}
}

关于c# - "Combined Type"- 泛型 - 其他东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23242308/

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