2009-04-08 13 views
4

これは2つの質問の1つです(もう1つは他よりも具体的です)。私はこのような方法がある場合はVB.NETでパラメータのタイプを修飾することはできますか?

Public Function Blah(String Foo) 
End Function 

が、私は別のタイプに対してはFooを修飾することはできますが(例えば私はfooはまた、メソッドはIInterfaceを実装して文字列であることを要求することができますか?)。さらに

Public Function Blah(RandomObject Foo Where RandomObject Is IInterface) 
End Function 

、Typeパラメータを修飾する方法があります:

私はこれまで漠然と似た何かを想像していますか?

たとえば、パラメータとして使用するタイプIを特定のクラスツリーに適用する必要がありますか?

Public Function Blah(Type t Where Type Of String) 
End Function 

クラス宣言自体は一般的なことができないので、私は(これは純粋にメソッドのパラメータを修飾するのではなく、クラスとそのメソッドをタイプに焦点を当てている私は、属性のプロパティのコンテキストでこれを使用していますことを言及する必要があります)。

答えて

3

これは私にジェネリックの場合のようです。あなたのメソッドのシグネチャは、VB.NETでこのようなものになるだろう:

Public Function Blah(Of T As {IImplementedByT})(Foo As T) 

これは、fooは限りTはIImplementedByTを実装して任意の型Tのものとすることができることを指定します。このメソッドは、ジェネリックである必要があるクラスを含むことなくジェネリックにすることができます。 、

Public Function Blah(Of T As {RandomClass, IImplementedByT})(Foo As T) 
+0

ありがとう - これは面白かったと便利でしたが、私がしたいことが何か他のものだったことが分かりました。私はこれをプロパティに適用しようとしていましたが、set句に型パラメータを持つことはできません。 –

0

「IInterfaceも実装している文字列にする」とは何を意味するのかよく分かりません。

文字列クラスは封印されているため、&から継承することはできません。したがって、その上にインターフェイスを実装することはできません。

私は正しいページにいることを希望します。

+0

オーケー文字列は悪い例だった、非密封されたクラスを想定しています。あなたはTもこのインタフェースを実装RandomClassから派生したクラスになりたい場合は、両方の制約を指定することができます。 –

1

タイプの最初の処理は実行できますが、非持続的な処理はできません。基本的に変数(パラメータを含む)はコンパイル時の型が1つしかないので、「FooIBarでなければならないということはできません - どちらかを選択する必要があります。 TFooから派生し、しかし「IBarを実装し、いくつかのタイプTすることが

ジェネリックは巨大なトピックです - 。スタックオーバーフローの答えでカバーするには大きすぎる - 。しかし、Microsoftはgood introductory articleを持っているあなたの第二については

あなたはそれを行うことはできません。実行時に値がわかるだけなので、実行時間をチェックする必要があります。しかし、Type.IsAssignableFromと。

+0

ありがとう - 私は十分にジェネリックスを理解していると思ったが、クラスを修飾しない限り、メソッドを修飾するためのVB.NET構文を取得できないようだ。型チェックに関しては、これはコンパイラが動作することができることの1つだと思いますが、あなたは正しく、動的な型付けを考慮しませんでした。 –

関連する問題