按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Using the Type Constraint
Type constraints allow you to associate a minimal type with the generics parameter。 For
example; suppose this interface is defined:
Interface IExample
Sub Method()
End Interface
Adding an IExample constraint to the generics parameter allows you to define a class
as follows:
Class ExampleMgr(Of DataType As { IExample})
Private _inst As DataType
Public Sub New(ByVal inst As DataType)
_inst = inst
End Sub
Public Sub DoSomething()
_inst。Method()
End Sub
End Class
In the example; the constraint of IExample allows a developer to call Method()。 If the constraint
were not there; the reference to Method would generate a piler error; because Method() is
not a method of DataType。
But is this ability to reference a method an advantage? After all; you could write the
ExampleMgr code without using generics; like this:
…………………………………………………………Page 446……………………………………………………………
424 CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C TE C H N IQ U E S
Class ExampleMgr
Dim _inst As IExample
Public Sub New(ByVal inst As IExample)
Me。_inst = inst
End Sub
Public Sub DoSomething()
_inst。Method()
End Sub
End Class
The generics code and the interface…based code do the exact same thing; and using
generics offers no advantage in this example。 But that is not always the case。 Consider the
following modified example of ExampleMgr。
Class ExampleMgr(Of DataType As { IExample })
Dim _inst As DataType
Public Sub New(ByVal inst As IExample)
Me。_inst = CType(inst; DataType)
End Sub
Public Sub DoSomething()
_inst。Method()
End Sub
Public ReadOnly Property Inst() As DataType
Get
Return _inst
End Get
End Property
End Class
With generics; you can write a property that contains a reference to the base type。 Had
you used the pure interface…based code; the Inst property would need to be of type IExample; and
to get the same effect as the generics example; a cast would be involved。 A cast is not the
end of the world; but it is inconvenient and not type…safe; since you don’t know if a cast will
work until you execute the code。
You can add multiple interfaces and classes as constraints; although you are limited。 The
limitations are identical to the limitations when subclassing a class or interface:
o You can subclass only a single class。
o You can subclass as many interfaces as desired; but they must be declared after the class。
…………………………………………………………Page 447……………………………………………………………
CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C T E C HN IQ U E S 425
Using the New Constraint
The purpose of the New constraint is to limit the data type to one that has a default constructor;
as in this example:
Class Example(Of DataType As {New})
Private _value As DataType
Public Sub New()
_value = New DataType()
End Sub
End Class
Without the New constraint; the bolded code cannot be piled。
The constructor that is defined with the New constraint does not take parameters; and it
would seem that this is a bother。 After all; you might want to instantiate the type with some
state。 What you can do is constrain DataType; and then instantiate the type using object initial
izers。 For example; the following is an interface that has a single property。
Interface IBase
Property Value() As Integer
End Interface
bining the IBase interface and the New keyword as constraints; you could write the
following code。
Class Example(Of DataType As {IBase; New})
Private _value As DataType
Public Sub New()
_value = New DataType() With {。Value = 10}
End Sub
End Class
In the modified example; the bolded code instantiates DataType; and then using the
constraints; the object initializer that defines _value is possible。
Using the Class Constraint
The main purpose of the Class constraint is to indicate whether the generics type is a value
type or a reference type。 Here is an example of a type that wants to manage only reference types:
Class AssumeReferenceType(Of DataType As {Class})
Private _value As DataType
Public Sub New(ByVal value As DataType)
End Sub
End Class
…………………………………………………………Page 448……………………………………………………………
426 CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C TE C H N IQ U E S
If you were to declare the AssumeReferenceType using an Integer; as shown in the following
example; the code would not pile。
Dim cls As AssumeReferenceType(Of Integer) = _
New AssumeReferenceType(Of Integer)(Nothing)
Nullable Types
In ; Nothing means no value; and we all understand what it represents; right? For example;
the following code shows how to use Nothing。
Dim value As Object = Nothing
If value Is Nothing Then
Console。WriteLine(〃Yup a Nothing〃)
End If
The example is obvious and does nothing useful。 If you attempted to call the Object。
ToSt