- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我感觉失去了我的 OO 知识。实际上,问题看起来很简单:我想创建一个类,它对一个对象进行操作
同时。
我可以创建一个新的表单类型公共(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 对象(因为在那里创建的 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/
我是一名优秀的程序员,十分优秀!