VI.1. Thay đổi trong thủ tục và hàm
Tham số là tham trị
Tham số truyền cho hàm hoặc thủ tục mặc định là tham trị ByVal chứ khơng phải ByRef như trong VB6. Trong VB6, tham số ParamArray vốn được truyền theo kiểu tham chiếu ByRef và khơng thể thay đổi thành ByVal nhưng trong VB.NET là tham trị ByVal và khơng thể thay đổi thành ByRef.
Tham số tùy chọn
Tham số tùy chọn Optional phải khai báo giá trị mặc nhiên, khi khơng truyền tham số.
Ví dụ:
Sub TEST(ByVal a As Integer,Optional ByVal c As Boolean = False) ' Các câu lệnh
End Sub
Cách hàm trả về giá trị
Giá trị của hàm cĩ thể trả về qua dịng lệnh Return.
Function TESTFUNCTION(ByVal a As Short, ByVal c As Short) As Integer ' Các câu lệnh
Return <giá trị trả về> End Function
Cho phép nhiều hàm, thủ tục trùng tênị
Cĩ thể cĩ nhiều hàm và thủ tục trùng tên nhau (Overloaded) miễn là số tham số hoặc kiểu dữ liệu tham số khác nhau.
Ví dụ:
Function BinhPhuong(ByVal so As Integer) As Integer Return Convert.ToInt32(so^2)
End Function
Function BinhPhuong(ByVal so As Double) As Double Return so^2
End Function
Trong VB6, nếu tham số truyền vào là thuộc tính của một đối tượng cho thủ tục kiểu ByRef, những thay đổi trên tham số đĩ trong thủ tục khơng phản ánh trên thuộc tính. Ngược lại, trong VB.NET, các thay đổi như vậy đều thể hiện trên thuộc tính của đối tượng.
VI.2. Khai báo Option Strict
Khai báo Option Strict On|Off là một lệnh mới khơng cho phép các chuyển đổi kiểu làm mất dữ liệu. Nhưng chúng ta cĩ thể thực hiện các chuyển đổi mở rộng như chuyển biến kiểu Integer sang kiểu Long. Khai báo này (khi bật On) sẽ khơng cho phép tự động chuyển đổi kiểu chuỗi sang kiểu số hay ngược lại.
Ví dụ:
Option Strict On
--- Dim x As String, y As Integer ' x = y sẽ gây lỗi cú pháp ' nhưng phải dùng
' hoặc
x = y.ToString
VI.3. Kiểu chuỗi cĩ độ dài cố định
Kiểu chuỗi cĩ độ dài cốđịnh trong VB6 khơng cịn được hỗ trợ trong VB.NET
VI.4. Chỉ thị #Region … #End Region
Chỉ thị #Region … #End Region được dùng đểđánh dấu một khối lệnh cĩ thể thu gọn, giản ra trên cửa sổ viết lệnh.
Cú pháp:
#Region <chuỗi định danh> ' khối lệnh
#End Region
<chuỗi định danh>: bắt buộc, cĩ giá trị kiểu String, là tiêu đề của khối lệnh
Ví dụ:
#Region "Các khai báo"
' Đưa vào các dịng lệnh khai báo. #End Region
Khi thu lại:
+ Các khai báo
VI.5. Imports khơng gian tên (Namespace)
Mục đích của lệnh Imports là đểđưa khơng gian tên vào trong Module cho việc khai báo và tạo các lớp trong khơng gian tên ngắn gọn hơn.
Cú pháp:
Imports [<bí danh> = ]<khơng gian tên> [.<thành phần>]
<bí danh>: tùy chọn, kiểu String, là tên tắt của <Namespace> được sử dụng trong tham chiếu trên Module, Class. Nếu lệnh Imports khơng cĩ phần bí danh, các thành phần định nghĩa trong khơng gian tên cĩ thể được truy cập mà khơng cần chỉ rõ. Nếu cĩ bí danh, bí danh phải được sử dụng trong phần truy cập.
<khơng gian tên>: bắt buộc, khơng gian tên sử dụng trong Module, Class
<thành phần>: tùy chọn, tên của một thành phần đã được khai báo trong khơng gian tên. Nĩ cĩ thể là
định danh, structure, class…
Chú ý
Mỗi lệnh Imports chỉđược sử dụng với một khơng gian tên.
Mỗi Module cĩ thể cĩ nhiều dịng Imports
Các lệnh Imports phải được đặt trước tất cả các khai báo, kể cả lệnh khai báo Module hoặc Class.
Khơng được phép định nghĩa một thành phần ở cấp Module cùng tên với bí danh đã đặt Ví dụ: Imports Str = Microsoft.VisualBasic.String Class lopVidu Sub Chao() MessageBox.Show(Str.Left("Chào bạn", 5)) End Sub End Class VII. Xử lý lỗi VII.1. Phân loại lỗi
Trong VB.NET, chúng ta cĩ thể gặp các loại lỗi sau:
VII.1.1. Syntax error
Lỗi cú pháp, cịn gọi là lỗi trong lúc thiết kế. Những lỗi này dễ chỉnh sửa vì VB.NET sẽ kiểm tra cú pháp khi ta đang nhập từ bàn phím nên sẽ báo lỗi tức thời khi ta gõ sai hoặc dùng một từ khơng thích hợp.
VII.1.2. Run-time error
Lỗi thực thi xảy ra khi chương trình đang thực thi. Đây là những lỗi khĩ xác định hơn lỗi cú pháp. Lỗi thực thi cĩ thể từ các lý do khác nhau như:
Mở một tập tin khơng tồn tại
Truy xuất một thư mục nhưng khơng cĩ quyền trên đĩ
Truy xuất dữ liệu một bảng khơng tồn tại trong CSDL
Chia cho số 0
Nhập chuỗi cho nơi cần nhập số hoặc ngược lại, v.v…
VII.1.3. Logic error
Lỗi luận lý cũng xảy ra khi chương trình đang thực thi và được thể hiện dưới những hình thức hay những kết quả khơng mong đợi. Loại lỗi này thường do sai lầm trong thuật giải.
VII.2. Xử lý lỗi
Một lỗi xảy ra khi chương trình đang chạy gọi là một Exception. Trong CLR, Exception là một đối tượng từ lớp System.Exception. Chúng ta cần lưu ý một lỗi xảy ra trong lúc thực thi khơng làm treo chương trình, nhưng nếu khơng được xử lý sẽ làm treo chương trình. CLR chỉ ra tình trạng lỗi qua lệnh Throw. Lệnh này sẽđưa ra một đối tượng kiểu System.Exception chứa thơng tin về lỗi đang xảy ra.
Trước đây, chúng ta thường sử dụng cú pháp On Error Goto <nhãn lỗi> để xử lý lỗi. Đây là một loại xử
lý khơng cấu trúc vì kể từ dịng lệnh On Error Goto <nhãn lỗi> đến cuối thủ tục hay hàm, nếu dịng lệnh nào gây lỗi chương trình đều nhường quyền xử lý cho đoạn lệnh của <nhãn lỗi>. Với VB.NET, chúng ta phát hiện và xử lý lỗi một cách chặt chẽ với cú pháp
Cú pháp: Try ' các lệnh cĩ khả năng gây lỗi Catch ' các lệnh xử lý khi lỗi xảy ra [Finally] ' các lệnh thực hiện sau cùng End Try
Cấu trúc này cho phép chúng ta thử (Try) thực hiện một khối lệnh xem cĩ gây lỗi khơng; nếu cĩ sẽ bẫy và xử lý (Catch) lỗi.
Cấu trúc này chia làm các khối sau:
Khối Try:
Chứa các câu lệnh cĩ khả năng gây lỗi
Khối Catch:
Các dịng lệnh để bẫy và xử lý lỗi phát sinh trên khối Try. Khối này gồm một loạt các lệnh bắt đầu với từ khĩa Catch, biến kiểu Exception ứng với một kiểu Exception muốn bẫy và các lệnh xử lý. Dĩ
nhiên, chúng ta cĩ thể dùng một lệnh Catch cho các System.Exception, nhưng như thế sẽ khơng cung cấp thơng tin đầy đủ cho người dùng về lỗi đang xảy ra cũng như hướng dẫn cách xử lý cụ
thể cho mỗi tình huống. Ngồi những lỗi đã xử lý, cĩ thể xảy ra những lỗi ngồi dự kiến, để xử lý các lỗi này, chúng ta nên đưa thêm một lệnh Catch để bẫy tất cả các trường hợp cịn lại và xuất thơng tin về lỗi xảy ra.
Khối Finally:
Khối tùy chọn, sau khi chạy qua các khối Try và Catch nếu khơng cĩ chỉđịnh nào khác, khối Finally sẽđược thực hiện bất kể cĩ xảy ra lỗi hay khơng.
Cuối cùng, cấu trúc bẫy và xử lý lỗi chấm dứt với từ khĩa End Try. Cú pháp chung cho một cấu trúc xử lý lỗi như sau
Try
' khối lệnh cĩ thể gây lỗi
Catch <biến1> As <Kiểu Exception> [When <biểu thức>] ' khối lệnh bẫy và xử lý lỗi
Catch <biến2> As <Kiểu Exception> [When <biểu thức>] ' khối lệnh bẫy và xử lý lỗi
Finally
' khối lệnh kết thúc End Try
Ví dụ:
Dim d as Double, i as Integer Try
i = CInt(InputBox(“Xin nhập một số nguyên”)) d = 42 \ i
Catch ex As DivideByZeroException
Messagebox.Show(“Khơng thể chia cho số khơng”) Catch ex As InvalidCastException
Messagebox.Show(“Xin nhập số nguyên !”) End Try
Câu lệnh Catch cĩ thể cĩ nhiều cách sử dụng:
VII.2.1. Bẫy khơng cĩ điều kiện
Dim d as Double, i as Integer Try i = CInt(InputBox(“Xin nhập một số nguyên”)) d = 42 \ i Catch Messagebox.Show(“Khơng thể chia") End Try
VII.2.2. Bẫy với kiểu lỗi chung Exception
Dim d As Double, i As Integer Try i = InputBox("Xin nhập một số nguyên") d = 42 \ i Catch ex As Exception MessageBox.Show("Khơng thể chia") End Try VII.2.3. Bẫy với những kiểu Exception đặc biệt Các kiểu Exception đặc biệt thường gặp Bảng liệt kê các Exception Tên Mơ tả
ArgumentException Tham số truyền khơng hợp lệ
DivideByZeroException Chương trình thực hiện phép chia một số cho số khơng
OverFlowException Kết quả của một phép tốn hoặc của một phép chuyển đổi kiểu lớn hơn khả năng lưu giữ của biến
FieldAccessException Chương trình truy xuất một field Private hoặc Protected của lớp InvalidCastException Chương trình đang cố thực hiện một chuyển đổi khơng hợp lệ
InvalidOperationException Chương trình đang cố gọi một thủ tục khơng hợp lệ
MemberAccessException Truy xuất một thành phần của một lớp bị thất bại
MethodAccessException Chương trình đang cố gọi thủ tục Private hoặc Protected của lớp NullReferenceException Chương trình đang cố truy xuất một đối tượng khơng tồn tại TypeUnloadException Chương trình truy xuất một lớp chưa được tải lên vùng nhớ
VII.2.4. Bẫy với điều kiện When
Dim d As Double, i As Integer Try
i = InputBox("Xin nhập một số nguyên") d = 42 \ i
Catch ex As Exception When i = 0
MessageBox.Show("Khơng thể chia cho số khơng") End Try
Bài 3
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
TRONG VISUAL BASIC .NET
Tĩm tắt
Lý thuyết 6 tiết - Thực hành 10 tiết
Mục tiêu Các mục chính Bài tập
Giới thiệu về Lập trình hướng đối tượng và cách xây dựng lớp đối tượng trong Visual Basic .Net
1. Lập trình hướng đối tượng 2. Lập trình hướng đối tượng trong
VB.NET
2.1, 2.2, 2.3, 2.4, 2.5
I. Lập trình hướng đối tượng
Tư tưởng chính của lập trình hướng đối tượng là xây dựng một chương trình dựa trên sự phối hợp hoạt
động của các đối tượng. Một đối tượng bao gồm hai thành phần chính là thơng tin lưu trữ và các thao tác xử lý. Trong thế giới thực, đối tượng là thực thể tồn tại như con người, xe, máy tính, v.v…Trong ngơn ngữ lập trình, đối tượng cĩ thể là màn hình, điều khiển v.v…
Lập trình hướng đối tượng là kiểu lập trình nhằm vào sự tương tác giữa các đối tượng. Mỗi đối tượng cĩ những thuộc tính (thơng tin lưu trữ), những phương thức xác định các chức năng của đối tượng. Bên cạnh đĩ, đối tượng cũng cĩ khả năng phát sinh các sự kiện khi thay đổi thơng tin, thực hiện một chức năng hay khi đối tượng khác tác động vào. Tất cả những thuộc tính, phương thức và sự kiện tạo nên cấu trúc của đối tượng. Cĩ bốn ý niệm trong Lập trình hướng đối tượng:
Abstraction: Tính trừu tượng
Encapsulation: Tính bao bọc
Inheritance: Tính kế thừa
Polymorphism: Tính đa hình
Mỗi ý niệm đều cĩ vai trị quan trọng trong lập trình hướng đối tượng.
I.1. Tính trừu tượng
Chúng ta thường lẫn lộn giữa lớp (Class) và đối tượng (Object). Cần phân biệt lớp là một ý niệm trừu tượng, cịn đối tượng là một thể hiện của lớp.
Ví dụ:
Class ConNgười là một ý niệm trừu tượng, nhưng NguyễnVănA là một đối tượng cụ thể. Từ những đối tượng giống nhau, chúng ta cĩ thể trừu tượng hĩa thành một lớp đối tượng.
Tính trừu tượng cho phép chúng ta loại bỏ tính chất phức tạp của đối tượng bằng cách chỉđưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.
I.2. Tính bao bọc
Mỗi Class được xây dựng để thực hiện một nhĩm chức năng đặc trưng của riêng Class, trong trường hợp một đối tượng thuộc Class cần thực hiện một chức năng khơng nằm trong khả năng vì chức năng
đĩ thuộc về một đối tượng thuộc Class khác, nĩ sẽ yêu cầu đối tượng đĩ đảm nhận thực hiện cơng việc. Một điểm quan trọng trong cách giao tiếp giữa các đối tượng là một đối tượng sẽ khơng được truy xuất trực tiếp vào thành phần dữ liệu của đối tượng khác cũng như khơng đưa thành phần dữ liệu của mình cho đối tượng khác một cách trực tiếp. Tất cả mọi thao tác truy xuất vào thành phần dữ liệu từ đối tượng này qua đối tượng khác phải được thực hiện bởi các phương thức (method) của chính đối tượng chứa dữ liệu. Đây cũng chính là một tính chất quan trọng trong lập trình hướng đối tượng gọi là tính bao bọc (encapsulation) dữ liệu.
Tính bao bọc cho phép dấu thơng tin của đối tượng bằng cách kết hợp thơng tin vớiø các phương thức liên quan đến thơng tin trong đối tượng.
Ví dụ:
những gì cần thiết cho Tài xế khi tương tác với Xe hơi. Xe hơi cĩ thể cĩ một đối tượng Động cơ nhưng Tài xế khơng cần phải quan tâm. Tất cả những gì cần quan tâm là những chức năng để cĩ thể vận hành xe. Do đĩ, khi thay một Động cơ khác, Tài xế vẫn sử dụng các chức năng cũđể vận hành Xe hơi bao lâu các phương thức phơ diễn bên ngồi (Interface) khơng bị thay đổi.
I.3. Tính kế thừa
Tính kế thừa là khả năng cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã cĩ. Lớp đã cĩ gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con và đương nhiên kế thừa tất cả các thành phần của lớp Cha, cĩ thể mở rộng cơng năng các thành phần kế thừa cũng như bổ sung thêm các thành phần mới
Chúng ta phân biệt hai loại quan hệ:
I.3.1. Là-một
Biểu thị tính kế thừa. Trong quan hệ "là-một", một đối tượng của lớp Con được xem như là một đối tượng của lớp Cha.
Ví dụ:
Từ lớp Xe ta tạo nên lớp Xe hơi mở rộng, lớp này mặc nhiên kế thừa tất cả các thành phần của lớp xe. Ta cĩ thể nĩi: một xe hơi là một chiếc xe.
I.3.2. Cĩ-một
Quan hệ này mang ý nghĩa gồm cĩ. Trong quan hệ "cĩ-một", một đối tượng cĩ thể cĩ một hoặc nhiều thành phần tham chiếu đến các đối tượng khác.
Ví dụ:
Khi lập mơ hình loại xe hơi, bạn muốn diễn tả ý tưởng chiếc xe "cĩ-một" tay lái. Chúng ta khơng thể
phát sinh lớp Xe hơi từ một Tay lái hay ngược lại (một Xe hơi "là-một" Tay lái !!!). Thay vì vậy, chúng ta phải cĩ hai lớp độc lập làm việc với nhau trong đĩ, lớp phía ngồi (lớp Xe hơi) sẽ tạo và phơ diễn cơng năng của lớp phía trong (lớp Tay lái).
I.4. Tính đa hình
Tính đa hình là khả năng một ngơn ngữ xử lý các đối tượng hữu quan theo cùng một cách. Tính đa hình thể hiện dưới nhiều hình thức:
I.4.1. Kết nối trễ - Late Binding
Đây là khả năng cho phép người lập trình gọi trước một phương thức của đối tượng, tuy chưa xác định
được đối tượng. Đến khi thực hiện, chương trình mới xác định được đối tượng và gọi phương thức tương ứng của đối tượng đĩ. Kết nối trễ giúp chương trình được uyển chuyển chỉ yêu cầu đối tượng cung cấp đúng phương thức cần thiết là đủ.
Ví dụ:
Xe
Chúng ta cĩ lớp Xe với phương thức Chạy và các lớp Xe đạp, Xe hơi, Xe đẩy cùng phát sinh từ lớp Xe. Chúng ta chưa biết sẽ sử dụng xe gì để di chuyển vì tùy thuộc tình hình cĩ sẵn xe nào nên gọi trước phương thức Chạy. Khi chương trình thực thi, tùy theo đối tượng của lớp nào được đưa ra mà phương thức Chạy của đối tượng đĩ được gọi.
I.4.2. Nạp chồng - Overloading
Khả năng cho phép một lớp cĩ nhiều thuộc tính, phương thức cùng tên nhưng với các tham số khác nhau về loại cũng như về số lượng. Khi được gọi, dựa vào tham số truyền vào, thuộc tính hay phương thức tương ứng sẽđược thực hiện.
I.4.3. Ghi chồng - Overriding
Hình thức này áp dụng cho lớp Con đối với lớp Cha. Lớp Con được phép cĩ một phương thức cùng tên, cùng số tham số cĩ kiểu dữ liệu như phương thức của lớp Cha hoặc những lớp trước đĩ nữa (lớp phát sinh ra lớp Cha …) với cài đặt khác đi. Lúc thực thi, nếu lớp Con khơng cĩ phương thức riêng, phương thức của lớp Cha sẽđược gọi, ngược lại nếu cĩ, phương thức của lớp Con được gọi.
II. Lập trình hướng đối tượng trong VB.NET
II.1. Tạo một Class
Chúng ta tạo một Class mới trong VB.NET bằng cách dùng thực đơn Project | Add Class. Hộp thoại Add New Item sẽ hiện ra, chọn Class trên khung bên phải và nhập tên vào ơ Name bên dưới