イントロ
この質問は、新しい言語機能の提案をこのサイトに投稿して、それらに関する一般的な意見を収集するというMarcGravellの提案によって促されました。
アイデアは、彼らが役立つかもしれないか、あるいは私が求めていることを達成するための別の方法がすでにあるかどうかを集めることです。
提案(制約付きタイプ)
VB.Netの通常の変数宣言は、次のように記述されます。
Dim SomeVariable as SomeType
次のフォームを許可することをお勧めします
Dim SomeVariable1 as {SomeType, ISomeInterface}
Dim SomeVariable2 as {SomeType, ISomeInterface, ISomeOtherInterface}
この構文は、ジェネリックスを制約するVb.Netのスタイルから借用しています。
なぜこれを許可するのですか?...それは何のために良いですか?
私が最初に考えた特定のケースは、コントロールの特定のサブセットを定義することでした。いくつかのビジネスルールに基づいてコントロールを提供する一連のコントロールファクトリのインターフェイスを作成したいと思いました。
これらのコントロールの利用者は、インターフェイスを介して、作成されたすべてのコントロールが、通常のコントロールには通常見られない追加機能をすべてのコントロールに提供する一連のインターフェイス(私の場合は1つのみ)も実装する必要があります。
以下は現在機能しないことに注意してください。
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にキャストできないため、「NewSpecialTextbox」を返そうとして失敗します。
"Value of type 'MyApp.SpecialTextBox' cannot be converted to 'T'"
私の工場は単純なコントロールを返すことができ、実行時にISpecialControlが実装されているかどうかを確認できますが、これにより実行時の問題が発生し、現在は実用的ではない場合でも論理的な可能性があるため、コンパイル時に確認したいと思います。
更新:これらのファクトリは外部(おそらくサードパーティ)のアセンブリに配置され、必要なコントロールライブラリに依存して、ISpecialControlも実装したこれらのコントロールの派生物を作成して返すことができるという考え方です。
これらのアセンブリは、自己構成リフレクション(最初のパスでのリフレクションとそれに続く構成で使用され、その後の実行で使用されます)を介して配置され、これらのコントロールがどのような依存関係を持っているかについて、呼び出し側アセンブリが知らないうちに使用できます。
これらのファクトリは、ポイントを無効にするため、呼び出すことが期待されるコントロールに関する情報を渡さずに構築可能である必要があります。
それで、あなたはどう思いますか...これは役に立ちますか?...これを達成するためのより良い方法はありますか?これを達成する方法はすでにありますか?