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


End Get 
End Property 
Public ReadOnly Property OneLeft() As SheetCoordinate 
Get 
Return New SheetCoordinate(Me。Row; (Me。Column 1)) 
End Get 
End Property 
Public ReadOnly Property OneRight() As SheetCoordinate 
Get 
Return New SheetCoordinate(Me。Row; (Me。Column + 1)) 
End Get 
End Property 
End Structure 
In the declaration of SheetCoordinate; notice that Structure is used rather than Class。
We could have used a class; but SheetCoordinate serves the purpose of being a piece of data。
SheetCoordinate is a type where you store information that is used by another type。 A data type
might do some processing; but only to make it easier to manipulate the data。 For example;
notice how SheetCoordinate has properties to generate a new instance of SheetCoordinate that
might be one row higher or lower; or a column to the right or left。 
The next step is to extend the worksheet definition and use generics to define the
type of worksheet。 The following is the plete definition of the IWorksheet。 These methods
…………………………………………………………Page 319……………………………………………………………
CH AP T E R 1 1 ■ L E A R N IN G AB O U T 。 N E T G E N E R I CS 297 
are used to calculate the values of cells in the worksheet and work with the contents of individual
cells (the state of those cells)。 We can also assign the function that carries out the calculation of
a cell’s contents; using either a SheetCoordinate type or the row and column coordinates。 
Public Interface IWorksheet(Of BaseType) 
Inherits IWorksheetBase 
Sub AssignCellCalculation(ByVal coords As SheetCoordinate; _ 
ByVal cb As Func(Of IWorksheet(Of BaseType); Integer; Integer; BaseType)) 
Sub AssignCellCalculation(ByVal row As Integer; ByVal col As Integer; _ 
ByVal cb As Func(Of IWorksheet(Of BaseType); Integer; Integer; BaseType)) 
Sub AssignColCalculation(ByVal col As Integer; _ 
ByVal cb As Func(Of IWorksheet(Of BaseType); _
Integer; Integer; BaseType)) 
Sub Calculate() 
Function Calculate(ByVal coords As SheetCoordinate) As BaseType 
Function Calculate(ByVal row As Integer; ByVal col As Integer) As BaseType 
Sub CalculateCol(ByVal col As Integer) 
Sub CalculateRow(ByVal row As Integer) 
Function GetCellState(ByVal coords As SheetCoordinate) As BaseType 
Function GetCellState(ByVal row As Integer; ByVal col As Integer) As BaseType 
Sub SetCellState(ByVal coords As SheetCoordinate; ByVal val As BaseType) 
Sub SetCellState(ByVal row As Integer; ByVal col As Integer; _ 
ByVal val As BaseType) 
ReadOnly Property Data() As BaseType (;) 
End Interface 
The declaration of IWorksheet is as a generics type; where BaseType is a generics
parameter that represents the type of the spreadsheet。 Since IWorksheet is a type of spreadsheet;
it subclasses the IWorksheetBase interface; allowing IWorksheet to be part of a mixed collection
of IWorksheet instances。 The IWorksheet interface is fairly plex and contains many methods。
However; here we are focusing on the interface concept; rather than the individual methods。 
Look at the bolded parts and notice how the interface is specific about the operations; but
vague about the type used in the operations。 This is what you want to achieve when using
generics。 You want to take a high…level approach and indicate which operations are available;
but leave out the types being manipulated in the operations。 The types will be specified later by
another programmer。 
…………………………………………………………Page 320……………………………………………………………
298 CH AP T E R 1 1 ■ L E A R N I N G A B OU T 。 N E T G E N E R I CS 
■Note The technique of having a generics type (such as IWorksheet) subclass a non… generics
type (such as IWorksheetBase) allows you to identify the general type that you are trying to describe with
some specialization in the generics type declaration。 
Defining the IWorkbook Interface 
Now that we’ve pleted the IWorksheet(Of BaseType) and IWorksheetBase interfaces; we
can define the workbook interface。 The workbook interface will not be a generics type;
since a workbook will contain multiple worksheet types。 However; as you will see; we can optimize
this interface to make it easier to use the workbook。
For the moment; let’s consider the plain…vanilla IWorkbook interface with no generics
types; which is defined as follows in the ServerSideSpreadsheet: 
Imports System。Reflection 
Imports Devspace。Trader。mon 
_ 
Public Interface IWorkbook 
Inherits IDebug 
ReadOnly Property Identifier() As String 
Default Property Item(ByVal identifier As String) As IWorksheetBase 
End Interface 
The IWorkbook interface defines an Identifier property and a default property Item。 Notice
how the attribute DefaultMember is defined to indicate the default property identifier (it is from
the System。Reflection namespace)。 Any class that implements IWorkbook is expected to contain
multiple references to IWorksheet(Of BaseType) instances。 How those references are managed
is not the responsibility of the IWorkbook interface; but of the IWorkbook interface implementation。
小说推荐
返回首页返回目录