Lời mở đầu
Trong chương trình đã học trước đây chúng ta đã được làm quen với
một phương pháp
l
ập trình đã có từ rất lâu và đơn giản đó là lập trình hướng
cấu trúc. Đối với các chương trình nhỏ thì phương pháp này tương đối hiệu
quả. Tuy nhiên, ngày nay khi quy mô các chương trình máy tính càng lớn và
có độ phức tạp cao thì phương pháp lập trình truyền thống này trở nên rất kém
hiệu quả. Và phương pháp lập trình hướng đối tượng ra đời nhằm khắc phục
những nhược điểm của phương pháp
l
ập trình cũ này.
Lập trình hướng đối tượng cung cấp 4 tính năng tạo nên sự khác biệt và
sức mạnh của nó khi so sánh với lập trình hướng cấu trúc là tính trừu tượng,
tính đóng gói, tính đa hình và tính kế thừa. Đặc biệt, khi kết hợp với một ngôn
ngữ lập trình mạnh hiện nay là C#, bộ đôi có khả năng giải quyết những bài
toán từ đơn giản đến phức tạp nhất.
Trong chương này, bạn sẽ được giới thiệu về nội dung quan trọng với
tiêu đề là “Lập trình hướng đối tượng trong C#”. Chương gồm 2 phần sau:
- Phần I: Lập trình hướng đối
t
ượng.
Phần này giới thiệu về phương pháp tiếp cận hướng đối tượng trong lập
trình với các tính chất, khái niệm của nó.
- Phần II: Lập trình hướng đối tượng trong C#. Phần này đề cập
đến việc lập trình hướng đối tượng trong ngôn ngữ lập trình mạnh hiện nay là
C#, bao gồm việc khai báo lớp, thuộc tính, cách thực hiện các phương thức, kế
thừa và nạp chồng.
Phần I: Lập trình hướng đối tượng.
3 .
1.1 G i ớ
i th
i ệ
u
về
l ậ
p
trình h ư ớ
ng đối
t ư ợn
g.
Khái niệm hướng đối tượng được xây dựng trên nền tảng của khái niệm
lập trình có cấu trúc và sự trừu tượng hóa dữ liệu. Sự thay đổi căn bản ở chỗ,
một chương trình hướng đối tượng được thiết kế xoay quanh dữ liệu mà chúng
ta có thể làm việc trên đó, hơn là theo bản thân chức năng của chương trình.
Điều này hoàn toàn tự nhiên một khi chúng ta hiểu rằng mục tiêu của chương
trình là xử lý dữ
li
ệu. Suy cho cùng, công việc mà máy tính thực hiện vẫn
thường được gọi là xử lý dữ liệu. Dữ liệu và thao tác liên kết với nhau ở một
mức cơ bản (còn có thể gọi là mức thấp), mỗi thứ đều đòi hỏi ở thứ kia có mục
tiêu cụ thể, các chương trình hướng đối tượng làm tường minh mối quan hệ
này.
Lập trình hướng đối tượng (Object Oriented Programming - gọi tắt là
OOP) hay chi tiết hơn là Lập trình định hướng đối tượng, chính là phương
pháp lập trình lấy đối tượng làm nền tảng để xây dựng thuật giải, xây dựng
chương trình. Thực chất đây không phải là một phương pháp mới mà là mộ
t
cách nhìn mới trong việc lập trình. Để phân biệt, với phương pháp lập trình
theo kiểu cấu trúc mà chúng ta quen thuộc trước đây, hay còn gọi là phương
pháp lập trình hướng thủ
t
ục (Procedure-Oriented Programming), người lập
trình phân tích một nhiệm vụ lớn thành nhiều công việc nhỏ hơn, sau đó dần
dần chi tiết, cụ thể hoá để được các vấn đề đơn giản, để tìm ra cách giải quyết
vấn đề dưới dạng những thuật giải cụ thể rõ ràng qua đó dễ dàng minh hoạ
bằng ngôn ngữ giải thuậ
t
(hay còn gọi các thuật giải này là các chương trình
con). Cách thức phân tích và thiết kế như vậy chúng ta gọi là nguyên lý lập
trình từ trên xuống (top-down), để thể hiện quá trình suy diễn từ cái chung cho
đến cái cụ thể.
Các chương trình con là những chức năng độc lập, sự ghép nối chúng
lại với nhau cho chúng ta một hệ thống chương trình để giải quyết vấn đề đặt
ra. Chính vì vậy, cách thức phân tích mộ
t
hệ thống lấy chương trình con làm
nền tảng, chương trình con đóng vai trò trung tâm của việc
l
ập trình, được
hiểu như phương pháp lập trình hướg về thủ tục. Tuy nhiên, khi phân tích để
thiết kế một hệ thống không nhất thiết phải luôn luôn suy nghĩ theo hướng
“làm thế nào để giải quyết công việc”, chúng ta có thể định hướng tư duy theo
phong cách “với một số đối tượng đã có, phải làm gì để giải quyết được công
việc đặt ra” hoặc phong phú hơn, “làm cái gì với một số đối tượng đã có đó”,
từ đó cũng có
t
hể giả
i
quyết được những công việc cụ thể. Với phương pháp
phân tích trong đó đối tượng đóng vai trò trùng tâm của việc lập trình như vậy,
người ta gọi là nguyên lý lập trình từ dưới lên (Bottom-up).
h t
tp :
/ /
w ww.ebook .
edu.vn
2
Lập trình hướng đối tượng liên kết cấu trúc dữ liệu với các thao tác,
theo cách mà tất cả thường nghĩ về thế giới quanh mình. Chúng ta thường gắn
một số các hoạt động cụ thể với một loại hoạ
t
động nào đó và đặt các giả thiết
của mình trên các quan hệ đó.
Ví dụ1.1: Để dễ hình dùng hơn, chúng ta thủ nhìn qua các công trình
xây dựng hiện đại, như sân vận động có mái che hình vòng cung, những kiến
trúc thẩm mĩ với đường nét hình cong. Tất cả những sản phẩm đó xuất hiện
cùng với những vật liệu xây dựng. Ngày nay, không chỉ chồng lên nhau những
viên gạch, những tảng đá để tạo nên những quần thể kiến trúc (như Tháp
Chàm Nha Trang, Kim Tự Tháp, ), mà có thể với bêtông, sắt thép và không
nhiều lắm những viên gạch, người xây dựng cũng có thể thiết kế những công
trình kiến trúc tuyệt mỹ, những toà nhà hiện đại. Chính các chất liệu xây dựng
đã làm ảnh hưởng phương pháp xây dựng, chất liệu xây dựng và nguyên lý kết
dính caá chất liệu đó lại với nhau cho chúng ta một đối tượng để khảo sát,
Chất liệu xây dựng và nguyên lý kết dính các chấ
t
liệu lại với nhau được hiểu
theo nghĩa dữ liệu và chương trình con tác động trên dữ liệu đó.
Ví dụ1.2: Chúng ta biết rằng một chiếc xe có các bánh xe, di chuyển
được và có thể đổ
i
hướng của nó bằng cách quẹo tay lái. Tương tự như thế,
một cái cây là một loại thực vật có thân gỗ và lá. Một chiếc xe không phải là
một cái cây, mà cái cây không phải là một chiếc xe, chúng ta có thể giả thiết
rằng cái mà chúng ta có thể làm được với một chiếc xe thì không thể làm được
với một cái cây. Chẳng hạn, thật là vô nghĩa khi muốn lái một cái cây, còn
chiếc xe thì lại chẳng lớn thêm được khi chúng ta tưới nước cho nó.
Lập trình hướng đối tượng cho phép chúng ta sử dụng các quá trình suy
nghĩ như vậy với các khái niệm trừu tượng được sử dụng trong các chương
trình máy tính. Một mẫu tin (record) nhân sự có thể được đọc ra, thay đổi và
lưu trữ lại; còn số phức thì có thể được dùng trong các tính toán. Tuy vậy
không thể nào lại viết một số phức vào tập tin làm mẫu tin nhân sự và ngược
lại hai mẫu tin nhân sự
l
ạ
i
không thể cộng với nhau được. Một chương trình
hướng đối tượng sẽ xác định đặc điểm và hành vi cụ thể của các kiểu dữ liệu,
điều đó cho phép chúng ta biết một cách chính xác rằng chúng ta có thể có
được những gì ở các kiểu dữ liệu khác nhau.
Chúng ta còn có thể tạo ra các quan hệ giữa các kiểu dữ liệu tương tự
nhưng khác nhau trong một chương trình hướng đối tượng. Người ta thường
tự nhiên phân loại ra mọi thứ, thường đặ
t
mối liên hệ giữa các khái niệm mới
với các khái niệm đã có, và thường có thể thực hiện suy diễn giữa chúng trên
các quan hệ đó. Hãy quan niệm thế giới theo kiểu cấu trúc cây, với các mức
xây dựng ch
i
tiết hơn kế tiếp nhau cho các thế hệ sau so với các thế hệ trước.
h t
tp :
/ /
w ww.ebook .
edu.vn
3
Đây là phương pháp hiệu quả để tổ chức thế giới quanh chúng ta. Các chương
trình hướng đối
t
ượng cũng làm việc theo một phương thức tương tự, trong đó
chúng cho phép xây dựng các các cơ cấu dữ
li
ệu và thao tác mới dựa trên các
cơ cấu có sẵn, mang theo các tính năng của các cơ cấu nền mà chúng dựa trên
đó, trong khi vẫn thêm vào các tính năng mới.
Lập trình hướng đối tượng cho phép chúng ta tổ chức dữ liệu trong
chương trình theo mộ
t
cách tương tự như các nhà sinh học tổ chức các loại
thực vật khác nhau. Theo cách nói lập trình đố
i
tượng, xe hơi, cây cối, các số
phức, các quyển sách đều được gọi là các lớp (Class).
Một lớp là một bản mẫu mô tả các thông tin cấu trúc dữ liệu, lẫn các
thao tác hợp lệ của các phần tử dữ liệu. Khi một phần tử dữ liệu được khai báo
là phần tử của một lớp thì nó được gọi là mộ
t
đối tượng (Object). Các hàm
được định nghĩa hợp lệ trong một lớp được gọi là các phương thức (Method)
và chúng là các hàm duy nhất có thể xử lý dữ liệu của các đối tượng của lớp
đó. Một thực thể (Instance) là một vật thể có thực bên trong bộ nhớ, thực chất
đó là một đối tượng (nghĩa là một đối
t
ượng được cấp phát vùng nhớ).
Mỗi một đối tượng có riêng cho mình một bản sao các phần tử dữ liệu
của lớp còn gọi là các biến thực thể (Instance variable). Các phương thức định
nghĩa trong một lớp có thể được gọi bởi các đố
i
tượng của lớp đó. Điều này
được gọi là gửi một thông điệp (Message) cho đối tượng. Các thông đ
i
ệp này
phụ thuộc vào đối tượng, chỉ đối tượng nào nhận thông điệp mới phải làm việc
theo thông điệp đó. Các đối tượng đều độc lập với nhau vì vậy các thay đổi
trên các biến thể hiện của đối tượng này không ảnh hưởng gì trên các biến thể
hiện của các đối tượng khác và việc gửi thông điệp cho một đối
t
ượng này
không ảnh hưởng gì đến các đối tượng khác.
Như vậy, đối tợng được hiểu theo nghĩa là một thực thể mà trong đó caá
dữ liệu và thủ tục tác động lên dữ liệu đã được đóng gói lại với nhau. Hay “đối
tượng được đặc trưng bởi một số thao tác (operation) và các thông tin
(information) ghi nhơ sự tác động của các thao tác này.”
Ví dụ 1.3: Khi nghiên cứ về ngăn xếp (stack), ngoài các dữ liệu vùng
chứa ngăn xếp, đỉnh của ngăn xếp, chúng ta phải cài đặt kèm theo các thao tác
như khởi tạo (creat) ngăn xếp, kiểm tra ngăn xếp rỗng (empty), đẩy (push)
một phần tử vào ngăn xếp, lấy (pop) một phần tử ra khỏi ngăn xếp. Trên quan
điểm lấy đối tượng làm nền tảng, rõ ràng dữ liệu và các thao tác trên dữ liệu
luôn gắn bó vớ
i
nhau, sự kết dính chúng chính là đối tượng chúng ta cần khảo
sá
t
.
Các thao tác trong đối tượng được gọi là các phương thức hay hành vi
của đối tượng đó. Phương thức và dữ liệu của đối tượng luôn tác động
l
ẫn
h t
tp :
/ /
w ww.ebook .
edu.vn
4
nhau và có vai trò ngang nhau trong đối tượng, Phương thức của đối tượng
được qui định bởi dữ liệu và ngược lại, dữ liệu của đối tượng được đặt trưng
bởi các phương thức của đối tượng. Chính nhờ sự gắn bó đó, chúng ta có thể
gởi cùng một thông điệp đến những đối tượng khác nhau. Điều này giúp người
lập trình không phải xử lý trong chương trình của mình một dãy các cấu trúc
điều khiển tuỳ theo thông điệp nhận vào, mà chương trình được xử lý vào thời
điểm thực hiện.
Lập trình hướng đối tượng là một mô hình có ưu thế trong những năm
gần đây, thay thế cho "structured", công nghệ lập trình hướng thủ tục là công
nghệ mà đã được phát triển từ những năm 1970. Java là tổng hoà của hướng
đối tượng và nó không thể lập trình theo kiểu hướng thủ tục mà bạn đã thoải
mái và quen thuộc với nó. Chúng tôi hi vọng với phần này - đặc biệt khi tổng
hợp cùng với các ví dụ được hỗ trợ trong text và các website quen thuộc - sẽ
giúp bạn đủ thông tin về OOP để trở thành đồng môn với Java.
Chúng ta sẽ bắt đầu với câu hỏi đó, trên bề mặt, dường như không có thứ
j làm với lập
t
rình: Làm thế nào mà các công ty như Compad, Dell, Gateway
và các nhà sản xuất máy tính cá nhân khác
l
ạ
i
trở nên lớn và nhanh đến vậy?
Hầu hết mọi người đều cho rằng họ làm ra những máy tính tốt và bán chúng
với giá rẻ ở kỉ nguyên mà máy tính trở nên phát triển nhanh và gấp gáp.
Nhưng trong
t
ương lai - họ đã sản xuất rất nhiều mô hình nhanh và đáp ứng lại
sự thay đổi nhanh chóng?
Một phần lớn của câu trả lời là những công ty này đã làm rất nhiều việc.
Họ đã mua các thiết bị từ sự tin cậy của các đại lý và sau đó tập trung họ. Họ
thường không đầu tư thời gian và tiền bạc cho việc thiết kế và xây dựng sức
mạnh của hàng cung cấp, ổ đĩa, motherboard và các thiết bị khác. Điều này tạo
cho các công ty sản xuất ra một sản phẩm và tạo sự thay đổi một cách nhanh
chóng mà ít tốn kém tiền bạc nhất hơn là họ làm kĩ sư cho chính họ.
Các nhà sản xuất máy tính cá nhân đã mua "các chức năng đã được đóng
gói". Ví dụ, khi họ mua một bộ nguồn, họ đang mua một cái j đấy với các
thuộc tính (kích cỡ, hình dạng và ) và
t
ấ
t
nhiên chức năng (bộ nguồn tốt, số
power hiển thị và những điều khác). Compad cung cấp một ví dụ cụ thể về
cách nó hoạt động hiệu quả. Khi Compad chuyển từ kĩ nghệ hầu hết các phần
trong máy để mua các phần khác, nó cải thiện từ dưới.
OOP Springs từ cùng một ý tướng. Chương trình của bạn được làm từ
các object với các thuộc tính và các hoạt động mà các object có thể thực hiện.
Khi bạn xây dựng một object hoặc mua nó thì phụ thuộc vào túi của bạn hoặc
đúng giờ (tức là dung lượng bộ nhớ và thời gian). Nhưng về cơ bản, nó đủ để
các object thoả mãn các đặc tả của bạn, bạn không phải quan tâm chức năng
được bổ sung. Trong OOP, bạn chỉ quan tâm về các object bộc lộ những đ
i
ểm
h t
tp :
/ /
w ww.ebook .
edu.vn
5
j. Vì thế, những nhà sản xuất máy tính không quan tâm bên trong về nguồn
cung cấp lâu như những j họ muốn, hầu hết các người lập trình Java không
quan tâm cách một object được bổ sung những j mà họ muốn.
Cấu trúc lập trình truyền thống bao gồm thiết kế một tập hợp các thủ tục
(hoặc giải thuật) để giả
i
quyết vấn đề. Sau khi các thủ tục được xác định, bước
tiếp theo là tìm cách kết hợp để lưu giữ data. Đ
i
ều này là điều giải thích nhà
thiết kế ngôn ngữ Pascal, Niklaus Wirth, gọi quyển sách nổi tiếng về
l
ập trình
của ông Giải thuật và Cấu trúc dữ liệu = Lập trình (Prentice Hall, 1975).
Chú ý rằng tribg tuêy đề của Wirth, giải thuật đi trước và cấu trúc dữ
liệu đến sau. Cách này giống như các nhà lập trình làm việc ở thời gian đó.
Trước tiên, bạn quyết định cách thao
t
ác vớ
i
dữ liệu, sau đó bạn quyết định
cấu trúc nào ép các dữ liệu này để việc thao tác dễ dàng hơn. OOP giữ việc
sắp xếp và và put data vào trước sau đó mới dùng các giải thuật thao tác trên
dữ
li
ệu. (Ngược với Pasca
l
).
Chìa khoá tạo nên sản phẩm trong OOP là tạo mỗi object sự phản hồi
đi cùng với một
t
ập hợp các nhiệm vụ có liên quan. Nếu một object giảm nhẹ
một nhiệm vụ mà không thuộc trách nh
i
ệm của nó, nó cần access đến một
object khác chịu trách nhiệm đó. Object đầu tiên đề nghị object thứ hai mang
nhiệm vụ ra ngoài. Nó được thực hiện với phiên bản tổng quát mà thủ tục gọi -
bạn thường quen thuộc với lập trình hướng thủ tục( Gọi lại trong ngôn ngữ lập
trình Java, các thủ tục này thường được gọ
i
là method calls).
Về cá nhân, một object tốt nhất không bao giờ thao tác trực tiếp với dữ
liệu bên trong của object khác, cũng không nên lộ dữ liệu cho object khác xử
lý trực tiếp. Tất cả mọi việc giao tiếp nên thông qua method. Bằng cách đóng
gói dữ liệu object, bạn giảm được tối đa, giảm sự phụ thuộc dữ
li
ệu, thời gian
debug rút ngắn
l
ại.
Tất nhiên, giống như module trong ngôn ngữ hướng thủ tục, bạn sẽ
không muốn một object cá nhân làm quá nhiều. Cả việc thiết kế và debug đều
trở nên đơn giản khi bản xây dựng các object nhỏ để thực hiện vài nhiệm vụ,
hơn là xây dựng các object với các dữ liệu bên trong cực kì phức tạp với hàng
trăm các thủ tục thao tác dữ
li
ệu.
Tóm lại, so sánh lập trình cấu trúc với chương trình con làm nền tảng:
Chương trình = Cấu trúc dữ liệu + Thuật giả
i
Trong lập trình hướng đối tượng chúng ta có
:
Đối tượng = Phương thức + Dữ
li
ệu
h t
tp :
/ /
w ww.ebook .
edu.vn
6
3 .
1.2
Các tính c h
ất củ
a l ậ
p
trình
h
ướng đ ố
i
t
ư ợ
ng:
Đối tượng (object): Các dữ liệu và chỉ thị được kết hợp vào một đơn vị
đầy đủ tạo nên một đố
i
tượng. Đơn vị này tương đương với một chương trình
con và vì thế các đối tượng sẽ được chia thành hai bộ phận chính: phần các
phương thức (method) và phần các thuộc tính (property). Trong thực
t
ế, các
phương thức của đối tượng là các hàm và các thuộc tính của nó là các biến,
các tham số hay hằng nội tại của một đối tượng (hay nói cách khác tập hợp
các dữ liệu nội tại tạo thành thuộc tính của đố
i
tượng). Các phương thức là
phương tiện để sử dụng một đối tượng trong khi các thuộc tính sẽ mô
t
ả đối
tượng có những tính chất gì.
Các phương thức và các thuộc tính thường gắn chặt với thực tế các đặc
tính và sử dụng của mộ
t
đối tượng. Trong thực tế, các đối tượng thường được
trừu tượng hóa qua việc định nghĩa của các
l
ớp (class). Tập hợp các giá trị
hiện có của các thuộc tính tạo nên trạng thái của một đối tượng. Mỗ
i
phương
thức hay mỗi dữ liệu nội tại cùng với các tính chất được định nghĩa (bởi người
lập trình) được xem là một đặc tính riêng của đối tượng. Nếu không có gì lầm
lẫn thì tập hợp các đặc tính này gọi chung là đặc tính của đối
t
ượng.
Lập trình hướng đối tượng là một phương pháp lập trình có các tính
chất chính sau:
a) Tính trừu tượng (abstraction): Đây là khả năng của chương trình bỏ
qua hay không chú ý đến một số khía cạnh của thông tin mà nó đang trực tiếp
làm việc lên, nghĩa là nó có khả năng
t
ập trung vào những cốt lõi cần thiết.
Mỗi đối tượng phục vụ như là một "động tử" có thể hoàn tất các công việc một
cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng
khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao
tác. Tính chất này thường được gọi là sự trừu tượng của dữ
li
ệu.
Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu có thể có
một số đặc đ
i
ểm chung cho nhiều đối tượng khác như là sự mở rộng của nó
nhưng bản thân đối tượng ban đầu này có thể không có các biện pháp thi hành.
Tính trừu tượng này thường được xác định trong khái niệm gọi là lớp trừu
tượng hay hay lớp cơ sở trừu
t
ượng.
b) Tính đóng gói (encapsulation) và che dấu thông tin (information
hiding): Tính chất này không cho phép người sử dụng các đối tượng thay đổi
trạng thái nội tại của một đối tượng. Chỉ có các phương thức nội tại của đối
tượng cho phép thay đổi trạng thái của nó. Việc cho phép môi trường bên
ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn
toàn tùy thuộc vào ngườ
i
viết mã. Đây là tính chất đảm bảo sự toàn vẹn của
đối
t
ượng.
h t
tp :
/ /
w ww.ebook .
edu.vn
7
c) Tính đa hình (polymorphism): Thể hiện thông qua việc gửi các
thông điệp (message). Việc gửi các thông điệp này có thể so sánh như việc gọi
các hàm bên trong của một đối tượng. Các phương thức dùng trả lời cho một
thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản
ứng khác nhau. Người lập trình có thể định nghĩa một đặc tính (chẳng hạn
thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau
nhưng khi thi hành thì dùng cùng một tên gọ
i
mà sự thi hành của mỗi đối
tượng sẽ tự động xảy ra tương ứng theo đặc tính của từng đối tượng mà không
bị nhầm
l
ẫn.
Thí dụ khi định nghĩa hai đối tượng "hinh_vuong" và "hinh_tron" thì có
một phương thức chung là "chu_vi". Khi gọi phương thức này thì nếu đối
tượng là "hinh_vuong" nó sẽ tính theo công thức khác với khi đối tượng là
"hinh_tron".
d) Tính kế thừa (inheritance): Đặc tính này cho phép một đối tượng có
thể có sẵn các đặc
tí
nh mà đối tượng khác đã có thông qua kế thừa. Điều này
cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không
phải tiến hành định nghĩa lại. Tuy nhiên, không phải ngôn ngữ định hướng đối
tượng nào cũng có tính chất này.
3 .
1.3 Các k h
ái n iệ
m
trong lập
trình h
ư ớ
ng đ ố
i t
ư ợ
ng
3.1.3.1 Đối tượng
Đối tượng là thực thể của hệ thống, của CSDL và được xác định thông
qua định danh ID (IDentifier) của chúng.
Mỗi đối tượng có tập các đặc trưng bao gồm:
Các phần tài sản thường là các dữ liệu thành phần hay các thuộc tính
mô tả các tính chất và các phương thức.
Các thao tác trên các dữ liệu để xác định hành vi của đối tượng đó.
Các mối quan hệ vớ
i
các đối tượng của các lớp khác.
Như vậy, đối tượng được định nghĩa một cách trừu tượng như là một
khái niệm, một cấu trúc gộp chung cả phần dữ liệu (thuộc tính) với các hàm
(phương thức) thao tác trên những dữ liệu đó và có thể trao đổi với những đối
tượng khác.
Đối tượng là những thực thể được xác định trong thời gian hệ thống
hướng đối tượng hoạ
t
động. Như vậy, đối tượng có thể biểu diễn cho người,
vật, hay một bảng dữ liệu hoặc bất kỳ một hạng thức nào đó cần xử lý trong
chương trình.
Mỗi đối tượng chỉ tồn tại trong thời gian nhất định trong hệ thống.
h t
tp :
/ /
w ww.ebook .
edu.vn
8
3.1.3.2 Lớp đối tượng
Lớp là bản mẫu hay một kiểu chung cho tất cả những đối tượng có
những đặc trưng giống nhau, nghĩa là có các thuộc tính và hành vi giống
nhau. Mỗi đối tượng chính là thể hiện (một cá thể, đại diện) của một lớp xác
định.Phương pháp lập trình hướng đối tượng là cách phân chia chương trình
thành các đơn thể (các lớp) bằng cách tạo ra các vùng bộ nhớ cho cả dữ liệu
lẫn hàm và chúng sẽ được sử dụng như các mẫu để tạo ra bản sao từng đối
tượng khi chúng được tạo ra trong hệ thống.
Con người
Xe
máy
Tên: Nam
Tuổi: 28
Trọng lượng: 65 kgs
Hành động:
Đ
i
Nói
Suy nghĩ
Loại: Future
Màu: Đỏ
Năm
:
1995
Hành động:
Khởi động
Ngừng
Chuyển động
Hình: Một đối tượng Con người và một đối tượng Xe máy
Lớp chính là tập các đối tượng có cùng các thuộc tính và hành vi giống
nhau. Các thành phần của lớp có thể chia thành ba vùng quản lý chính:
+ Công khai (public),
+ Được bảo vệ (protected),
+ Riêng (private).
h t
tp :
/ /
w ww.ebook .
edu.vn
9
Lớp Con người
- Tên: Kiểu chuỗ
i
- Tuổi: Kiểu sốố
- Trọng lượng: Kiểu sốố
. Đ
i
. Nói
. Suy nghĩ
Lớp Xe máy
- Loại: Kiểu chuỗ
i
- Màu: Kiểu chuỗ
i
- Năm: Kiểu sốố
. Khởi động
. Ngừng
. Chuyển động
Hình: Một Lớp Con người và một Lớp Xe máy
Chú ý: Sự khác biệt thực sự giữa một lớp và một đối
t
ượng:
9
Một lớp định nghĩa một thực thể, trong khi đó một đối tượng là một
trường hợp của thực thể ấy.
9
Đối tượng là một mô hình thực, trong khi lớp là một mô hình khái niệm
- định nghĩa tất cả các thuộc tính và các phương thức cần thiết của mộ
t
đối
t
ượng.
9
Tất cả các đối tượng thuộc về cùng một lớp có cùng các thuộc tính và
các phương thức.
9
Một lớp là một nguyên mẫu của một đối tượng. Nó xác định các hành
động khả thi và các
t
huộc tính cần thiết cho một nhóm các đối tượng cụ
thể
3.1.3.3 Trừu tượng hóa dữ liệu (Abstraction)
Quá trình trừu tượng hoá chỉ tập trung vào những tính chất chung nhất,
chính nhất và bỏ qua những chi tiết vụn vặt. Ta nói rằng từ mô hình dữ liệu có
thể dẫn ra những kiểu dữ liệu trừu
t
ượng.Kiểu dữ liệu trừu tượng là một mô
hình dữ liệu dựa trên những những đặc tính chính và một số phép toán xác
định trên những cấu trúc dữ liệu đã lựa chọn, phục vụ cho việc giải một lớp
các bài toán nào đó. Trừu tượng hóa là sự mở rộng khái niệm kiểu dữ liệu và
cho phép định nghĩa những phép toán trừu tượng trên các dữ liệu trừu tượng.
Khi xây dựng phần mềm thì nguyên lý trừu tượng hoá được thực hiện thông
qua việc trừu tượng hoá các chức năng, hàm (thuật toán) và trừu tượng hoá
các kiểu dữ
li
ệu nguyên thuỷ.
h t
tp :
/ /
w ww.ebook .
edu.vn
10
3.1.3.4 Bao gói và che giấu thông tin (Encapsulation and Information
Hiding)
Việc đóng gói dữ liệu và các hàm vào một đơn vị cấu trúc (gọi là lớp)
được xem như mộ
t
nguyên tắc bao gói thông tin. Kỹ thuật này cho phép xác
định các vùng đặc trưng riêng, công khai hay được bảo vệ bao gồm cả dữ liệu
và các câu lệnh nhằm điều khiển hoặc hạn chế những truy nhập tùy tiện của
những đối tượng khác. Đóng gói dữ liệu và các hàm vào một đơn vị cấu trúc
(gọi là lớp) được xem như một nguyên tắc bao bọc thông tin. Các hàm thành
phần công khai của lớp sẽ đóng vai trò như là giao diện giữa các đối tượng và
với phần còn lại của hệ thống. Nguyên tắc bao bọc dữ liệu để ngăn cấm sự
truy nhập trực tiếp trong lập trình được gọi là sự che giấu thông
ti
n.
Dữ liệu riêng
Hàm riêng
Dữ liệu công kha
i
Hàm công khai
3.1.3.5 Sự mở rộng, kế thừa giữa các lớp (Inheritance)
¾ Nguyên lý kế thừa cho phép các đối tượng của lớp này được quyền
sử dụng một số tính chất (cả dữ liệu và các hàm thành phần) của các
lớp khác.
¾ Một lớp có thể là lớp con (lớp dẫn xuất) của một lớp khác, nghĩa là
có thể bổ sung thêm mộ
t
số tính chất để thu hẹp phạm vi xác định các
đối tượng trong lớp mới cho phù hợp với ngữ cảnh trong thực
t
ế.
h t
tp :
/ /
w ww.ebook .
edu.vn
11
¾ Theo nguyên lý chung của kế thừa thì chỉ những thuộc tính, hàm
thành phần được bảo vệ và công khai là được quyền kế thừa, còn những
thuộc tính, hàm thành phần riêng là không được phép kế thừa.
Phương pháp hướng đối tượng nói chung hỗ trợ hai nguyên lý kế thừa:
¾ Kế thừa đơn: một lớp có thể kế thừa từ một lớp cơ sở
¾ Kế thừa bội: một lớp có thể kế thừa từ nhiều hơn một lớp cơ sở.
Có thể diễn đạt cơ chế kế thừa như sau:
¾ Bổ sung thêm một số thuộc tính, hàm để mô tả được đúng các
hành vi của những đố
i
tượng mà lớp A quản lý.
¾ Lớp A kế thừa lớp B sẽ có (không tường minh) tất cả các thuộc
tính, hàm đã được xác định trong B, ở những vùng được phép kế thừa (được
bảo vệ, công khai),
Có thể diễn đạt cơ chế kế thừa như sau:
+ Lớp A kế thừa lớp B sẽ có (không tường minh) tất cả các thuộc
tính, hàm đã được xác định trong B, ở những vùng được phép kế thừa (được
bảo vệ, công khai),
+ Bổ sung thêm một số thuộc tính, hàm để mô tả được đúng các
hành vi của những đố
i
tượng mà lớp A quản lý.
+ Viết đè (thay đổi hành vi ứng xử) của các hàm được kế thừa.
3.1.3.6 Đa xạ (tương ứng bội) và nạp chồng (Polymorphism and
Overloading).
¾ Đa xạ là kỹ thuật được sử dụng để mô tả khả năng gửi một thông điệp
chung tới nhiều đố
i
tượng mà mỗi đối tượng lại có cách xử lý riêng theo
ngữ cảnh của mình.
h t
tp :
/ /
w ww.ebook .
edu.vn
12
¾ Đa xạ đóng một vai trò quan trọng trong việc tạo ra các đối tượng có
cấu trúc với những nộ
i
dung thực hiện khác nhau mà lại có khả năng sử dụng
chung một giao diện (cùng một tên gọi). Theo một nghĩa nào đó, đa xạ là sự
mở rộng khái niệm sử dụng lại trong nguyên lý kế thừa.
¾ Nạp chồng (Overloading) là một trường hợp của đa xạ: một khái niệm
(như các phép toán chẳng hạn) có thể được sử dụng với nhiều nội dung thực
hiện khác nhau tùy theo ngữ cảnh, cụ thể là tuỳ thuộc vào kiểu và số các tham
số của chúng.
Ví d ụ
:
int Cong(int, int); // Cộng hai số nguyên
float Cong(float, float); // Cộng hai số thực
Complex Cong(Complex, Complex); // Cộng hai số phức
String Cong(String, String);
//
Ghép hai xâu
String Cong(String, int); // Ghép một xâu với một số
nguyên.
3.1.3.7 Liên kết động (Dynamic binding)
¾ Liên kết thông thường (liên kết tĩnh) là dạng liên kết được xác định
ngay khi dịch chương trình.
¾ Liên kết động là dạng liên kết các hàm, chức năng khi chương trình
thực hiện các lời gọi các hàm, chức năng đó theo ngữ cảnh hiện
t
hời.
h t
tp :
/ /
w ww.ebook .
edu.vn
13
¾ Trong liên kết động, nội dung của đoạn chương trình ứng với chức
năng, hàm sẽ không được xác định cho đến khi các lời gọi hàm được
thực hiện theo ngữ cảnh lúc thực hiện.
3.1.3.8 Truyền thông điệp (Message Passing)
Chương trình hướng đối tượng bao gồm một tập các đối tượng và mối
quan hệ giữa các đố
i
tượng đó với nhau. Lập trình trong ngôn ngữ hướng đối
tượng bao gồm các bước sau:
9
Tạo ra các lớp đối tượng và mô tả hành vi của chúng,
9
Tạo ra các đối tượng theo định nghĩa của các
l
ớp,
9
Xác định sự trao đổi thông tin giữa các đối tượng trong hệ thống.
Nguyên lý trao đổi
t
hông tin bằng cách truyền thông điệp cho phép
chúng ta dễ dàng xây dựng được hệ thống mô phỏng gần hơn với thực
t
ế.
Truyền thông điệp cho một đối tượng tức là báo cho nó phải thực hiện một
việc, một yêu cầu (thỉnh cầu) nào đó. Cách ứng xử của đối tượng sẽ được mô
tả ở trong lớp thông qua các hàm công khai (hay còn được gọi là lớp dịch vụ).
Trong chương trình, thông điệp gửi đến cho một đối tượng chính là để
yêu cầu thực hiện mộ
t
công việc cụ thể, nghĩa là sử dụng những hàm tương
ứng để xử lý dữ liệu đã được khai báo trong
l
ớp đố
i
tượng đó.
Ví dụ, khi hệ thống máy tính muốn in một tệp dataFile thì máy tính
hiện thời (
:
Compute r
) gửi đến cho đối tượng : P r i nte
r Serve
r một yêu cầu
Print(dataFile).
h t
tp :
/ /
w ww.ebook .
edu.vn
14
Phần II: Lập trình hướng đối tượng với C#.NET
3 .
2.1 L ớ
p
3.2.1.1 Định nghĩa
l
ớp
Class – là một định nghĩa cho một kiểu của người dùng (user-defined
type – UDT). Class hay còn gọi là lớp là sự gói gọn các dữ liệu và phương
thức (method ) hoạt động trên dữ
li
ệu đó.Trong C# lớp được coi là kiểu dữ
liệu tham chiếu( reference) và như vậy các thể hiện( instance) của lớp sẽ được
chứ ở vùng nhớ heap và được quản lí bởi bộ thu gom rác( GC). Khi một thể
hiện của
l
ớp được tạo thì nó sẽ được phân phối vùng nhớ trên heap và các
tham chiếu đến đối tượng bắt đầu được đếm. Khi số đếm tham chiếu bằng 0
thì GC sẽ phục hồi vùng nhớ bị chiếm bởi đối tượng và trả bộ nhớ sang trạng
thái sẵn sàng để sử dụng.
Class có thể chứa: các trường(fields), các phương thức(methods), các
thuộc
tí
nh(properties), sự kiện (events), và các lớp lồng nhau. Lớp có thể được
thừa kế từ những lớp khác và phát triển đa giao diện (multiple
i
nterfaces).
Lớp ảo (abstract class) không thể tạo trực tiếp nhưng cung cấp các
thuộc tính để lớp kế
t
thừa định nghĩa. Lớp thật (concrete class) được tạo trực
ti
ếp.
Định nghĩa một lớp mới với cú pháp như sau:
[attribute] [bổ từ truy xuất] class <tên của lớp> [:lớp cơ sở]
{
}
Trong đó:
thân
l
ớp
Bổ từ truy xuất
Bổ từ truy xuất xác định thành viên (nói tắt của biến thành viên và
phương thức thành viên) nào của lớp được truy xuất từ lớp khác. Có các loại
kiểu truy xuất sau
:
Từ khóa Giải thích
public Truy xuất mọi nơ
i
protected Truy xuất trong nội bộ lớp hoặc trong các lớp con
h t
tp :
/ /
w ww.ebook .
edu.vn
15
internal Truy xuất nội trong chương trình (assemb
l
y)
protected
internal
Truy xuất nội trong chương trình (assembly) và
trong các
l
ớp con.
private( mặc
định)
Chỉ được truy xuất trong nội bộ
l
ớp
Bảng 3.2-1 Các bổ từ truy xuấ
t
Thân
l
ớp
Trong thân lớp là các chức năng được định nghĩa trong lớp như: phương
thức(methods), các
t
huộc tính(properties), constructor, hay các nạp chồng toán
hạng(Operator Over
l
oads).
Attribute
Một attribute là 1 thứ dùng để đánh dấu (marker) mà được ứng
dụng đến 1 phương thức hay 1 lớp thậm chí là 1 đối số riêng trong 1 phưong
thức ,cung cấp thông tin thêm về mục đó. ví dụ attribute Conditional có thể
được dùng để đánh dấu 1 phương thức như là 1 phương thức debug như sau
:
[Conditional("DEBUG")]
public void DoSomeDebugStuff()
{
// do something
}
Để áp dụng 1 attribute đến 1 mục ta cung cấp tên của attribute trong
ngoặc vuông ngay trước định nghĩa mục. Các attribute lấy vài thông số -
những thông số này cung cấp bên trong dấu ngoặc theo sau tên attribute. Ở
cấp độ cơ bản nhất của nó, ứng dụng 1 attribute vào 1 mục có thể đơn giản chỉ
là thông tin thêm về mục đó đựợc bỏ trong assembly đuợc biên dịch dùng cho
mục đích hướng dẫn thêm. 1 số attribute được định nghĩa trong các lớp cơ sở
được nhận ra bởi trình biên dịch C#.mà
t
ừ đó trình biên dịch có thể gây ra
những tác động trên mã. Ví dụ trên trình biên dịch sẽ biên dịch mã của mục
Conditional chỉ nếu biểu tượng DEBUG đã được định nghĩa trước. Trong
phần này ta sẽ xem xét 3 attribute sau
:
- Conditional: có thể đánh dấu bất kì phương thức với attribute
Conditional. Sẽ ngăn ngừa trình biên dịch từ việc biên dịch phương thức đó
hay bất kì câu lệnh mà tham khảo đến nó nếu
t
ên biểu tượng không được định
nghĩa. Điều này có thể được dùng cho điều kiện biên dịch.
h t
tp :
/ /
w ww.ebook .
edu.vn
16
- Dllimport - đôi khi ta cần truy nhập đến các Window API cơ bản hoặc
các hàm kiểu cũ khác mà được thực thi trong các window DLLs.attribute.
Dllimport dùng cho mục đích này. Nó được dùng đánh dấu 1 phương thức
được định nghĩa trong Dll bên ngoài.
- Obsolete - attribute này được dùng để đánh dấu 1 phương thức được
xem như obsolete ( không dùng nữa). Tuỳ thuộc vào việc thiết lập trên
attribute này, trình biên dịch sẽ sinh ra 1 cảnh báo hay lỗi nếu nó gặp bất kì
mã nào cố gắng dùng phương thức này.
Ví dụ 3.2-1: Khai báo một lớp
public class MyClass
{
public static int Main( )
{
}
}
3.2.1.2 Đối tượng
Khi khai báo một lớp ta định nghĩa các đặc tính chung của tất cả các đối
tượng của lớp và các hành vi của chúng. Object – chỉ đơn giản là một thuật
ngữ chỉ về một thực thể (instance) của mộ
t
class nào đó trong bộ nhớ. Đối
tượng là một trị có thể được tạo ra, lưu giữ và sử dụng. Trong C#
t
ấ
t
cả các
biến đều là đối tượng. Các biến kiểu số, kiểu chuỗi … đều là đối tượng. Mỗi
một đối tượng đều có các biến thành viên để lưu giữ dữ liệu và có các phương
thức (hàm) để tác động lên biến thành viên. Mỗi đối tượng thuộc về một lớp
đối tượng nào đó. Các đối tượng có cùng lớp thì có cùng các biến thành viên
và phương thức.
Tạo một đối tượng bằng cách khai báo kiểu và sau đó dùng từ khoá new
để tạo cú pháp như sau:
<tên kiểu> <tên đối tượng> = new <tên
l
ớp>
Ví dụ 3.2-2: Khai báo, tạo và sử dựng một lớp
using System
;
public class Time
{
// phương thức public
public void DisplayCurrentTime( )
{
h t
tp :
/ /
w ww.ebook .
edu.vn
17
Console.WriteLine( "stub for DisplayCurrentTime" );
}
// các biến private
int Year; int Month; int Date
;
int Hour; int Minute; int Second
;
}
public class Tester
{
static void Main( )
{
Time t = new Time( );
t.DisplayCurrentTime( );
}
}
Các lớp và hàm Abstract
:
C# cho phép cả lớp và phương thức có thể khai báo abstract. Một lớp
abstract không được thể hiện và một phương thức abstract không được thực
thi mà phải được overriden trong bất kỳ
l
ớp thừa hưởng không abstract nào.
Một phương thức abstract sẽ tự động được khai báo virtual. Nếu mộ
t
lớp có
phương thức abstract thì nó cũng là lớp abstract và được khai báo như sau:
abstract class Building
{
public abstract decimal CalculateHeatingCost(); // abstract method
}
Sealed các lớp và phương thức:
C# cho phép các lớp và phương thức được khai báo sealed. Nếu là lớp
có nghĩa là bạn không được quyền thừa kế lớp đó, nếu là phương thức tức là
bạn không được phép override nó. C# sử dụng
t
ừ khoá sealed trước tên lớp và
phương
t
hức:
sealed class FinalClass
{
//etc
}
class DerivedClass : FinalClass // wrong. Will give compilation error
{
//etc
}
class MyC
l
ass
h t
tp :
/ /
w ww.ebook .
edu.vn
18
{
Public sealed override void FinalMe
t
hod()
{
//etc
}
}
Class DerivedClass : MyClass
{
public override void FinalMethod() // wrong. Will give compilation error
{
}
}
Chú ý: Trong C#, nếu bạn không chỉ rõ rằng một lớp được thừa kế
t
ừ
một lớp khác thì trình biên dịch sẽ tự động hiểu rằng lớp của bạn thừa kế từ
lớp Object. Đều này có nghĩa là ngoài những thuộc tính và phương thức mà
bạn định nghĩa thì bạn có thể truy cập đến những phương thức protected và
public của lớp Object. Và những phương thức này cũng có trong tất cả lớp mà
bạn định nghĩa.
3 .
2.2 Thuộc tín
h (properties):
Để định nghĩa thuộc tính trong C# bạn dùng cú pháp sau:
[bổ từ truy xuất] <kiểu trả về> <tên thuộc tính>
{
[get { statement;}]
[set { statement;}]
}
Trong lớp trình C++, thông thưòng để đọc hoặc gán giá trị cho biến
thành viên, lập trình viên thường viết hai hàm get và set tương ứng cho biến.
C# cung cấp khai báo hàm chung gọi là property cho hàm get và set. Ví dụ:
trong lớp DocGia có biến thành viên m_sHoTen, cài đặt Property cho biến
thành viên này như sau
:
public string HoTen
{
get { return m_sHoTen; }
set { m_sHoTen = value; }
}
Property có một vài khác biệt so với hàm thành viên. Thứ nhất khai báo
h t
tp :
/ /
w ww.ebook .
edu.vn
19
Property không có tham số và cặp ngoặc. Trong thân property dùng hai từ
khóa get/set tương ứng cho hai hành động lấy/thiết đặt giá trị thuộc tính.
Phương thức set thiết lập giá trị một property của đố
i
tượng và có trị trả về là
void. Phương thức set có thể ghi vào cơ sở dữ liệu hay cập nhật biến thành
viên khi cần. Trong thân set, có biến mặc định là value, biến này sé mang kiểu
đã được khai báo property, như trong trường hợp trên là string. Biến value sé
nhận giá trị được gán cho Property. Thân của phương thức truy cập get cũng
giống như các phương thức khác nhưng phương thức này trả vể mộ
t
đối tượng
kiểu là một đặc tính của lớp. Cách sử dụng một Property như sau:
1 // trong thân của một hàm
2 DocGia dgMoi = new DocGia();
3
4 // sử dung property set
5 dgMoi.HoTen = "Nguyễn Văn A"
;
6
7 // sử dụng property ge
t
8 string ten = dgMoi.HoTen; //ten có giá trị "Nguyễn Văn A"
Ở dòng mã thứ 5, khối set trong property HoTen sẽ được gọi, biến value
sẽ có giá trị của biến nằm sau phép gán (trong trường hợp này là "Nguyễn Van
A"). Nếu trong thân hàm không cài đặt hàm set, property sẽ có tính chỉ đọc,
phép gán sẽ bị cấm. Ngược lại nếu không cài đặt hàm get, property sẽ có tính
chỉ ghi.
Public string SomeProperty
{
get
{
return “This is the property value”;
}
set
{
// do whatever needs to be done to set the property
}
}
Có sự hạn chế thông thường ở đây là: Thủ tục get không có tham số và
phải trả về cùng kiểu với thuộc tính đã được khai báo. Bạn không nên khai
báo tường minh các tham số trong thủ tục set, mà trình biên dịch sẽ tự động
biết là có một tham số cùng kiểu trỏ đến giá trị. Cho một ví dụ, đoạn mã sau
h t
tp :
/ /
w ww.ebook .
edu.vn
20
chứa một thuộc tính gọi là ForeName, nó sẽ cài một trường foreName có
chiều dài giới hạn:
private string foreName
;
public string ForeName
{
get
{
return foreName
;
}
set
{
if(value.Length>20)
//code here to take error recovery action
// (eg. Throw an exception)
else
foreName = va
l
ue
;
}
}
Khác với VB các thủ tục get và set được định nghĩa như là những hàm
riêng biệt, trong C# chúng được khai báo cùng nhau trong một khai báo thuộc
tính đơn.Trong VB bạn khai báo tường minh tham số cho thủ tục set và có thể
chọn tên của nó, nhưng ngược lại trong C# tham số này hoàn toàn giả lập và
luôn mang tên là value.
Thuộc tính chỉ đọc và chỉ viết:
Bạn có thể tạo ra thuộc tính chỉ đọc bằng cách bỏ thủ tục set trong khai
báo và tạo ra thuộc
tí
nh chỉ ghi bằng cách bỏ thủ tục get trong khai bao thuộc
tính đó. Ví dụ để định nghĩa thuộc tính Forename là chỉ đọc:
private string foreName
;
public string ForeName
{
ge
t
{
return foreName
;
}
}
Bổ từ truy cập:
h t
tp :
/ /
w ww.ebook .
edu.vn
21
C# không cho phép cài đặt những bổ từ khác nhau cho thủ tục set và
get. Nếu bạn muốn
t
ạo ra một thuộc tính có public để đọc nhưng lại muốn hạn
chế protected trong gán thì đầu tiên bạn phải
t
ạo thuộc tính chỉ đọc với bổ từ
public sau đó tạo một hàm set() với bổ từ protected ở bên ngoài thuộc tính đó.
public string ForeName
{
get
{
return foreName
;
}
}
protected void SetForeName( string value)
{
if (value.Length >20)
//code here to take error recovery action
//(eg. Throw an exception)
else
}
foreName =va
l
ue
;
Thuộc tính Virtual và Abs
t
ract:
C# cho phép bạn tạo một thuộc tính virtual hay abstract. Để khai báo
một thuộc tính virtual, overriden hay abstract bạn chỉ cần thêm từ khoá đó
trong lúc định nghĩa thuộc tính. Ví dụ để tạo mộ
t
thuộc tính abstract thì cú
pháp như sau:
public abstract string ForeName
{
get;
se
t
;
}
Ví dụ sử dụng Property
:
using System
;
using System.Collections.Generic;
using System.Text;
namespace vd3.2.2
{
h t
tp :
/ /
w ww.ebook .
edu.vn
22
public class Time
{
// public accessor methods
public void D
i
splayCurrentTime()
{
Console.WriteLine("Time\t: {0}/{1}/{2} {3}:{4}:{5}",
month, date, year, hour, minute, second);
Console.ReadL
i
ne()
;
}
// constructors
public Time(System.DateTime dt)
{
year = dt.Year;
month = dt.Month;
date = dt.Day
;
hour = dt.Hour;
minute = dt.Minute;
second = dt.Second;
}
// tạo một đặc
tí
nh
public int Hour
{
get { return hour; }
set { hour = value; }
}
// các biến thành viên kiểu private
private int year;
private int month;
private int date;
private int hour;
private int minute;
private int second;
}
public class Tes
t
er
{
static void Main()
{
DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t
.DisplayCurrentTime();
h t
tp :
/ /
w ww.ebook .
edu.vn
23
int theHour = t.Hour;
Console.WriteLine("\nRetrieved the hour: {0}\n",
theHour);
Console.ReadLine();
theHour++;
t.Hour = theHour;
Console.WriteLine("Updated the hour: {0}\n",
theHour);
Console.ReadL
i
ne()
;
}
}
}
3 .
2.3 P h
ư ơng
t hức
Mỗi lớp có thuộc tính và hành vi. Hành vi được định nghĩa là phương
thức thành viên của
l
ớp.
Một phương thức là một hàm sở hữu bởi lớp mà chúng ta định nghĩa.
Thỉnh thoảng người ta gọ
i
phương thức thành viên là hàm thành viên. Hàm
thành viên định nghĩa những gì lớp của chúng
t
a có thể làm và hành vi của nó
như thế nào? Thông thường một phương thức là một tên của hành động.ví dụ
WriteLine. Tuy nhiên chúng cũng có thể là các tên đặc biệt như Main().
9
Khai báo phương thức là một liên lạc giữa người tạo và sử dụng
phương
t
hức.
9
Để khai báo một phương thức chúng ta cần chỉ ra kiểu giá trị về
theo sau bởi tên. Một phương thức có thể có tham số hay không.
[thành phần khai báo]<giá trị trả về><tên phương thức>(tham số)
{
//than phuong thuc
}
Thành phần khai báo là các từ khóa: public,static,abstract,private…
Giá trị trả về là kiểu dữ liệu mà ta có thể cho phương thức đó trả về. Nếu
phương thức khônng có kiểu trả về ta sử dung từ khóa void.
h t
tp :
/ /
w ww.ebook .
edu.vn
24
Các thành phần khai báo public được sử dụng bên trong và bên ngoài của
l
ớp
+ Các thuộc tính thường được khai báo là private đã được bảo vệ an toàn
dữ
li
ệu
+ Các phương thức thường được khai báo public để chúng có thể gọi đến
các hàm trong chương trình
+ Còn hàm thành phần protected cũng giống hàm private chỉ khác là
protected có thể truy nhập được từ định nghĩa các hàm dẫn xuấ
t
+ abstract:- abstract có thể dùng để định nghĩa Method : bắt buộc phải
override ở subclass. Method này chỉ định nghĩa mà không viết đầy đủ
thân.Nếu trong class có một phương thức abs
t
ract thì class đó buộc phải là
abstract
+ static: Method và Variable : được truy xuất trực tiệp thông qua tên class
mà không cần khởi dựng đối
t
ượng.
+ final: Method : không cho phép override ở subc
l
ass
Còn thân của phương thức có thể được thực hiện luôn trong khai báo lớp
hoặc ở bên ngoài. Kh
i
xây dựng phương thức, chúng ta cần chú ý là phương
thức có thể sử dụng các thành phần khác của
l
ớp.
Ví dụ sau là một hàm với một tham số kiểu nguyên và phương thức trả về
một giá trị kiểu nguyên.
public void nhap()
{
Console.WriteLine("Moi ban nhap vao mot so thuc");
n = floa
t
.Parse(Console.ReadLine());
}
public float getN()
{
return n;
}
h t
tp :
/ /
w ww.ebook .
edu.vn
25