【发布时间】:2009-02-16 11:40:40
【问题描述】:
简介
这个问题是由 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。
这些程序集可以通过自配置反射(第一次通过反射,然后是配置,然后在进一步运行中使用)定位,并且调用程序集在不知道这些控件将采取何种依赖关系的情况下使用这些程序集。
它确实要求这些工厂是可构造的,而无需传递有关它们期望调用的控件的信息,因为这会破坏这一点。
那么你觉得……这会有用吗?……有没有更好的方法来实现这一点?是否已经有办法实现这一目标?
【问题讨论】:
-
您能提供一个 C# 示例吗?对于那些不了解 VB 的人来说,它会更容易阅读,并且还有语法着色的额外好处。
-
我修复了 C# 部分的格式。不应该使用制表符,所以我用空格替换了它们。我还修改了
SpecialTextBox.New()以返回 void。 (我想这就是你的意图。如果不是,那么我道歉。) -
感谢 Hosam 的帮助。看起来好多了:)
-
我在 C# 中删除了不必要的默认构造函数,无论如何它的语法不正确。使用 SpecialTextBox() 代替 New()。 ;)
标签: c# vb.net types constraints