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
Mã lệnh của Class nầy sẽ được chứa trong một tập tin cĩ phần mở rộng là vb. Trong VB.NET tất cả các tập tin nguồn của các đối tượng form, class, module …đều cĩ phần mở rộng là vb. Hệ thống sẽ nhận diện ra loại nào tùy theo nội dung của chúng chứ khơng dựa vào phần mở rộng.
Nhấn OK, để xác nhận tạo tập tin, tập tin sẽ được tạo và đưa vào Project. Lúc này trên cửa sổ mã lệnh của Class chứa các dịng sau:
Public Class <tên Class> End Class
Chúng ta cĩ thể khai báo một lớp với cú pháp sau
Cú pháp:
[<Từ khố>] Class <tên Class> End Class
Mọi thuộc tính, phương thức hoặc sự kiện của Class được tạo ra phải nằm trong hai dịng lệnh trên. Từ khĩa cĩ thể là một trong các giá trị ở bảng sau:
Các từ khĩa khai báo Class
Tên Mơ tả
Public Các thực thể khai báo với từ khĩa này cĩ thể sử dụng ở mọi nơi. Private Cho biết thực thể khai báo chỉ được sử dụng trong phạm vi khai báo.
Protected Cho biết thực thể khai báo chỉ được sử dụng trong phạm vi Class và SubClass (lớp và lớp con).
Friend Cho biết thực thể khai báo chỉ được sử dụng trong phạm vi Project. Nếu khơng cĩ từ khĩa, Class mặc nhiên là khai báo Friend.
Protected Friend Cho biết thực thể khai báo cĩ phạm vi sử dụng của Protected và Friend.
Shadows Cho biết lớp này đang che mờ một thành phần trong lớp cơ sở. Thành phần bị che mờ khơng thể sử dụng trong lớp này.
MustInherit Cho biết các thành phần non-shared của lớp chỉ cĩ thể truy xuất thơng qua các lớp kế thừa. Các thể hiện của lớp khai báo kiểu này khơng thể khởi tạo.
NotInheritable Cho biết lớp này khơng cho phép kế thừa.
II.2. Tạo một NameSpace mới
Trong một tập tin như trên cĩ thể chứa nhiều Class khác nhau.
Chúng ta cĩ thể tổ chức các Class cùng loại, cùng nhĩm vào chung một khơng gian tên (NameSpace) do chúng ta tạo ra.
Ví dụ:
Namespace Dong_vat Public Class An_co End Class
Public Class An_thit End Class
End Namespace
Để tham chiếu đến một Class được khai báo trong Namespace, chúng ta phải thơng qua tên
Namespace.
Ví dụ:
Một khơng gian tên cĩ thể xuất hiện trong nhiều tập tin Class khác nhau trong một Project.