gpt4 book ai didi

c# - "Constrained Types"在 VB/C# 中有用吗?

转载 作者:太空狗 更新时间:2023-10-29 19:47:37 25 4
gpt4 key购买 nike

简介

这个问题是由 Marc Gravell 提出的,我建议我将新的语言功能建议发布到该网站以收集对它们的普遍意见。

我的想法是收集他们是否有帮助,或者是否已经有另一种方法来实现我所追求的目标。

建议(约束类型)

VB.Net中一个普通的变量声明是这样写的:

Dim SomeVariable as SomeType

我建议允许以下形式

Dim SomeVariable1 as {SomeType, ISomeInterface}
Dim SomeVariable2 as {SomeType, ISomeInterface, ISomeOtherInterface}

这个语法是借鉴了Vb.Net的约束泛型的风格

为什么允许这样做?...它有什么用?

嗯,我最初想到的具体情况是定义一个特定的控件子集。我希望为一系列控制工厂创建一个接口(interface),这些工厂将提供基于某些业务规则的控制。

这些控件的使用者会通过接口(interface)要求创建的所有控件还应该实现一些接口(interface)系列(在我的例子中只有一个接口(interface)),这些接口(interface)为所有这些控件提供了在普通控件中通常找不到的额外功能。

值得注意的是,以下目前不起作用。

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。

这些程序集可以通过自配置反射(第一遍反射,然后配置,然后在进一步运行中使用)定位,并且在调用程序集不知道这些控件将采取什么依赖性的情况下使用。

它确实要求这些工厂在不传递有关它们预期调用的控件的信息的情况下是可构建的,因为那会破坏这一点。

那么您认为...这会有用吗?...是否有更好的方法来实现这一目标?是否已经有办法实现这一目标?

最佳答案

我认为,虽然表面上有用,但这种事情最好由两者之一处理:

  • 通过动态 Duck Typing(在 VS2010 中提供)获得更大的灵 active ,尽管消除了类型安全。
  • 一般组成

您的原始示例既不需要,也可以很容易地像这样工作:

public interface IControlProvider<T>
where T : Control, ISpecialControl
{
T CreateControl();
}

public class SpecialTextBoxProvider : IControlProvider<SpecialTextBox>
{
public SpecialTextBox CreateControl()
{
return new SpecialTextBox();
}
}

事实上,鉴于大多数控件都有一个默认的公共(public)构造函数,您可以使它更容易:

public class ControlProvider : IControlProvider<T>
where T : Control, ISpecialControl, new()
{
public T CreateControl()
{
return new T();
}
}

var control = ControlProvider<SpecialTextBox>.CreateControl();

考虑到调用代码的附加限制不直接对 SpecialTextBox 进行引用依赖,这将不起作用。

关于c# - "Constrained Types"在 VB/C# 中有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/553046/

25 4 0