.NET Generics cho VB.NET 2005

.NET Generics cho VB.NET 2005

Bài tập VB.NET 2005

Bài tập nâng cao VB.NET 2005

Hướng dẫn học VB.NET 2005

.NET 2.0 hỗ trợ những templates gọi là generics. Ý tưởng cơ bản về generics như sau: định nghĩa một method hay class với một hay nhiều methods, và chỉ định kiểu dữ liệu (data type) như một phần tử có thể thay thế được. Ký tự T thường được sử dụng đại diện cho kiểu dữ liệu. Cuối cùng, khi sử dụng method hay class, chỉ định kiểu của generic T và trình biên dịch sẽ sử dụng thông tin mới này để phát sinh một method hay class mới, duy nhất dựa trên kiểu dữ liệu.

Định nghĩa một Generic Method

Sử dụng điều này khi muốn tách rời kiểu dữ liệu, tham số với thuật tóan, vì thông thường mỗi kiểu dữ liệu khác nhau sẽ cho một method khác với cùng thuật tóan. Generic methods cũng hỗ trợ ràng buộc tòan vẹn về kiểu dữ liệu và overloading.

Ví dụ dưới đây mô tả về việc cài đặt vvà sử dụng hàm hóan đổi 2 giá trị Swap.

    Public Sub Swap(Of T)(ByRef a As T, ByRef b As T)
 
      Dim temp As T
      temp = a
      a = b
      b = temp
    End Sub
 

Và khi gọi hàm

 
      Dim I As Integer = 5
      Dim J As Integer = 7
      Swap(Of Integer)(I, J)
 
 
      Dim S As String = "Paul"
      Dim R As String = "Lori"
      Swap(Of String)(S, R)
 

Chú ý khi định nghĩa hàm và khi gọi hàm đều có chỉ định về kiểu dữ liệu (Of T)

Thiết lập phương thức Generic với Constraint

Giả sử chúng ta cần kiểm tra kiểu dữ liệu: chỉ cho phép thực thi với kiểu dữ liệu kiểu non-nullable structure types. Xem ví dụ dưới đây, chỉi cho phép thực thi với kiểu dữ liệu cấu trúc (sẽ không họat động với kiểu dữ liệu String)

Public Sub Swap(Of T As Structure)(ByRef a As T, ByRef b As T)
  Dim temp As T
  temp = a
  a = b
  b = temp
End Sub

Thamsố kiểu dữ liệu giới hạn đến những kiểu: structures, classes, base classes, interfaces, và những kiểu có default constructor (Sub New không tham số).

Overloading Generic Methods

Methods có thể overloaded dựa trên tham số nhưng không trả về kiểu dữ liệu.

Sub Foo
Sub Foo(ByVal s As String)
Sub Foo(Of T)( ByVal arg As T)
Sub Foo(Of T, U)(ByVal arg1 As T, ByVal arg2 as U)

 

Định nghĩa Generic Class

Generic classes được định nghĩa như class thông thường, với một khác biệt. Một class thông thường được định nghĩa khi chúng ta có kiểu dữ liệu và hàm của class làm việc với kiểu datatype biết trước. Generic classes được định nghĩa khi methods và data kết dính với nhau và có thể trừu tượng hóa dữ lịêu để có thể hỗ trợ nhiều lọai dữ liệu.

Ví dụ, queues, lists, stacks không quan tâm đến việc phải chứa lọai dữ liệu gì, mà chỉ quan tâm đến việc làm sao lưu trữ nó. Nếu chúng ta sử dụng queue, stack, list thông thường, chúng ta phải thực hiện chuyển kiểu. Nếu sử dụng generic queue, stack, list, việc chuyển kiểu thực hiện tự động bên trong class.

Định nghĩa generic class tương tự định nghĩza generic methods, với 1 điểm thêm vào: (Of T)  được thêm vào ở đầu class.

Xem ví dụ dưới đây

Public Class TypedCollection(Of T)
  Inherits System.Collections.CollectionBase
 
  Default Public Property Item(ByVal Index As Integer) As T
    Get
      Return CType(List(Index), T)
    End Get
    Set(ByVal value As T)
      List(Index) = value
    End Set
  End Property
 
  Public Function Add(ByVal value As T) As Integer
    Return List.Add(value)
  End Function
 
End Class
 
Public Class OrthoInjury
  Private FHasXray As Boolean
  Private FDescription As String
  Private FPrognosis As String
 
  Public Sub New(ByVal HasXray As Boolean, _
    ByVal Description As String, ByVal Prognosis As String)
 
    FHasXray = HasXray
    FDescription = Description
    FPrognosis = Prognosis
  End Sub
 
  Public Property HasXray() As Boolean
    Get
      Return FHasXray
    End Get
    Set(ByVal value As Boolean)
      FHasXray = value
    End Set
  End Property
 
  Public Property Description() As String
    Get
      Return FDescription
    End Get
    Set(ByVal value As String)
      FDescription = value
    End Set
  End Property
 
  Public Property Prognosis() As String
    Get
      Return FPrognosis
    End Get
    Set(ByVal value As String)
      FPrognosis = value
    End Set
  End Property
End Class

 

 
Module Module1
    Sub Main()
      Dim BrokenBones As TypedCollection(Of OrthoInjury) = _
        New TypedCollection(Of OrthoInjury)
 
      BrokenBones.Add(New OrthoInjury(True, _
        "Broken Right Clavicle", "Vicodin; Heals n 8 to 12 weeks"))
      BrokenBones.Add(New OrthoInjury(True, _
        "Fractured Posterior Rib #5", "Heals in 6 to 8 weeks"))
 
      BrokenBones.Add(New OrthoInjury(True, _
        "Fractured Posterior Rib #1", "Heals in 6 to 8 weeks"))
 
      Dim injury As OrthoInjury
      For Each injury In BrokenBones
        Console.WriteLine("Description: " & injury.Description)
      Next
      Console.ReadLine()
    End Sub
 
End Module
 

 

Sử dụng Predefined Generic Classes

May mắn là chúng ta không cần phải định nghĩa generic classes từ đầu: System.Collections.Generic namespace đã định nghĩa nhiều classic data structures, như List, Queue, và Stack ở dạng generics.

Ví dụ, tạo custom typed collection với .NET 2.0 generic List typed collection:

Dim BrokenBones As System.Collections.Generic.List(Of OrthoInjury) = _
  New System.Collections.Generic.List(Of OrthoInjury)

As a general rule, if you want to store more than one type (heterogeneous types), use the older style classes like Queue and Stack. If you want to use just one type (homogeneous types), use the newer generic classes in the System.Collections.Generic namespace. Generally, you’ll want the newer generic classes.

~ bởi duriangroup on Tháng Chín 12, 2007.

 
%d bloggers like this: