介绍
这个问题是由 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。
这些程序集可以通过自配置反射(第一次通过的反射,然后是配置,然后在进一步运行中使用)定位,并且调用程序集在不知道这些控件将采取何种依赖关系的情况下使用这些程序集。
它确实要求这些工厂是可构造的,而无需传递有关它们期望调用的控件的信息,因为这会破坏这一点。
那么你觉得……这会有用吗?……有没有更好的方法来实现这一点?有没有办法实现这一目标?