《VB2008从入门到精通(PDF格式英文版)》第198章


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
小说推荐
返回首页返回目录