“约束类型”在VB / C#中是否有用?
介绍
Marc Gravell建议我向本网站发布新的语言功能建议以收集关于它们的一般意见. 我们的想法是收集它们是否有用,或者可能已经有另一种方式来实现我所追求的目标. 建议(约束类型) 因此编写VB.Net中的正常变量声明: Dim SomeVariable as SomeType 我建议允许以下表格 Dim SomeVariable1 as {SomeType,ISomeInterface} Dim SomeVariable2 as {SomeType,ISomeInterface,ISomeOtherInterface} 这种语法借鉴了Vb.Net的约束泛型的风格 为什么允许这样做?…有什么好处? 我最初想到的具体情况是定义一个特定的控件子集. 这些控件的使用者需要通过接口创建所有控件,还应该实现一系列接口(在我的情况下只有一个),这些接口为所有这些控件提供了普通控件中通常找不到的附加功能. 值得注意的是,以下目前不起作用. Public Interface ISpecialControl End Interface Public Interface IControlProvider Function CreateControl(Of T As {Control,ISpecialControl})() As T End Interface Public Class SpecialTextBoxProvider Implements IControlProvider Public Function CreateControl(Of T As {Control,ISpecialControl})() As T Implements IControlProvider.CreateControl Return New SpecialTextBox End Function End Class Public Class SpecialTextBox Inherits TextBox Implements ISpecialControl Public Sub New() End Sub End Class 我认为这可以转换为C#: public interface ISpecialControl { } public interface IControlProvider { T CreateControl<T>() where T : Control,ISpecialControl; } public class SpecialTextBoxProvider : IControlProvider { public T CreateControl<T>() where T : Control,ISpecialControl { return new SpecialTextBox(); } } public class SpecialTextBox : TextBox,ISpecialControl { } 由于无法将SpecialTextbox强制转换为T,因此返回“New SpecialTextbox”的尝试失败. "Value of type 'MyApp.SpecialTextBox' cannot be converted to 'T'" 我意识到我的工厂可以被允许返回简单的控件,我可以在运行时检查它们是否实现了ISpecialControl,但是这会产生运行时问题,我宁愿在编译时检查它,因为它是合乎逻辑的可能性,即使当前不是实际的 更新:这个想法是这些工厂可能位于外部(甚至可能是第三方)程序集中,并且可以依赖于他们想要的任何控件库,创建并返回这些控件的衍生产品,这些控件也实现了ISpecialControl. 这些程序集可以通过自配置 – 反射(第一次通过反射,然后进行配置,然后在进一步的运行中使用)来定位,并且在调用程序集不知道这些控件将具有什么依赖性的情况下使用. 它确实要求这些工厂是可构造的,而不传递有关他们预期要控制的控制的信息,因为那样会破坏这一点. 那你觉得怎么样……这会有用吗?……有没有更好的方法来实现这一目标?有没有办法实现这一目标?
我认为,虽然表面上很有用,但这两种情况之一可以更好地处理:
>鸭子通过动态打字(进入VS2010)获得更大的灵活性,尽管消除了类型安全性. 您的原始示例既不需要也可以像以下一样轻松地工作: public interface IControlProvider<T> where T : Control,ISpecialControl { T CreateControl(); } public class SpecialTextBoxProvider : IControlProvider<SpecialTextBox> { public SpecialTextBox CreateControl() { return new SpecialTextBox(); } } 事实上,鉴于大多数控件都有一个默认的公共构造函数,您可以使它更容易: public class ControlProvider : IControlProvider<T> where T : Control,ISpecialControl,new() { public T CreateControl() { return new T(); } } var control = ControlProvider<SpecialTextBox>.CreateControl(); 鉴于调用代码没有直接对SpecialTextBox进行引用依赖的额外限制,这将无法工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |