PDA

View Full Version : OOP 2 : Class/Object



danceswithwolves
18-09-2002, 13:19
OOP 2 : Giao diện của đối tượng
Interface of object

Aristotle chắc hẳn là người đầu tiên nghiên cứu khái niệm type (kiểu); ông đã từng phát biểu về “chủng loài cá và chủng loài chim” (the class of fishes and the class of birds). Ý tưởng “mọi đối tượng, ngoài tính đơn nhất, luôn là một thành phần của một chủng loài, có những tính cách và hành vi chung” đã được áp dụng vào NNLT hướng đối tượng đầu tiên là Simula-67, với từ khóa cơ bản class đã giới thiệu một “kiểu” mới cho LTV.
Class (lớp) có thể hiểu như là bản mô tả tập hợp những object (đối tượng có những thuộc tính (thành phần dữ liệu) và hành vi (chức năng) như nhau. Một class thực tế là một kiểu dữ liệu đặc biệt mà mỗi biến được khai báo từ đó ngoài việc mang dữ liệu, còn có những chức năng xử lý dữ liệu của bản thân. Cái hay ho là LTV định nghĩa một class (tạo một kiểu dữ liệu mới) để giải quyết vấn đề chứ không bị buộc phải lệ thuộc vào những kiểu dữ liệu có sẵn (được các nhà thiết kế NNLT thiết kế theo đơn vị lưu trữ trên máy tính). LTV có thể mở rộng ngôn ngữ bằng cách định nghĩa thêm các kiểu dữ liệu đặc thù cho vấn đề của riêng mình.
Một khi LTV định nghĩa thành công một class, LTV có thể tạo bao nhiêu object tùy thích (hmm, dĩ nhiên tớ đang cố ý quên không xét đến những giới hạn của phần cứng), rồi thì tha hồ chơi bời với chúng như thể chúng là những thành phần tồn tại trong vấn đề bạn giải quyết. Thực tế, một trong những thách thức của OOP là công việc thiết lập sự tương quan giữa những object trong phạm vi vấn đề cần giải quyết (bài toán) và những object trong phạm vi giải pháp (giải pháp).
Làm cách nào “bắt” object hành động ? Chắc chắn phải có một cách nào đó để LTV “ra lệnh” cho object, kêu nó làm cái gi đó; chẳng hạn như với object Form, kêu nó “biến” đi cho khuất mắt hay bắt nó dịch chuyển ra góc màn hình. Mỗi object chỉ có thể hiểu được những “yêu cầu” nhất định, tùy thuộc vào hệ thống class mà nó được sinh ra; ví dụ như với object Dogs thì ta kêu nó “bark” (sủa) được, chứ kêu nó “fly” (bay) thì nó chịu chết (tất nhiên nếu bác LTV nào hứng lên viết cho class Dogs một method fly thì ta sẽ có một loài chó biết bay). Trở lại vấn đề, những yêu cầu có thể đối với một object được định nghĩa bởi giao diện (interface) của nó; và, chính “kiểu” quyết định giao diện này.
Ví dụ ta đã định nghĩa một class Light với hai chức năng là TurnOn (thực hiện bật đèn) và TurnOff (thực hiện tắt đèn). Cú pháp code giống như C++, tuy nhiên tớ nghĩ dễ hiểu cả với người chưa biết C++.


// khai báo một object mylight thuộc class Light
Light mylight = new Light();
// tới đây ta có một cái đèn tên là mylight

// bật đèn mylight lên cho sáng
mylight.TurnOn(); // --> đèn sáng

// tắt đèn mylight tiết kiệm điện mùa khô
mylight.TurnOff(); // --> đèn tắt

Giao diện quyết định những yêu cầu nào có thể đưa ra cho một object. Tuy nhiên, rõ ràng là phải có code ở đâu đó được thực hiện khi object nhận yêu cầu. Code này, cùng với những dữ liệu ẩn, là những đặc tả implementation. Với những bạn có kiến thức về lập trình thủ tục (procedural programming), có thể hiểu như là mỗi “kiểu” có những hàm (function) liên đới, tương ứng với mỗi yêu cầu. Khi object nhận được yêu cầu, hàm tương ứng sẽ được gọi. Tiến trình này thường được tổng quát hóa bằng cách mô tả LTV “gửi một thông điệp” (send a message/make a request) đến một object, và object đó biết phải làm gì (execute code) với thông điệp này.
Trong ví dụ trên, tên của “kiểu”/class là Light, và mylight là tên một object cụ thể thuộc class Light. Bạn có thể thấy rằng, với những object thuộc class Light, những yêu cầu hợp lý có thể là TurnOn (bật), TurnOff (tắt), MakeBrighter (chỉnh sáng), MakeDimmer (chỉnh tối) v.v... Đoạn code Light mylight = new Light() thực hiện việc đăng ký vùng nhớ cho một object kiểu Light, thực hiện khởi tạo object (initialization, sẽ bàn sau) và gán một tham chiếu (reference) tên mylight đến object đó. Để dễ hiểu hơn, bạn hãy tưởng tượng object kiểu Light (chiếm một vùng nhớ trên bộ nhớ) như là một cái đèn xịn, biến tham chiếu mylight như là một cái remote (đèn xịn mà lị). Mỗi khi cần gì, bạn không phải chạy lại chỗ cái đèn mà chỉ cần bấm cái remote mylight là xong. Chính vì tham chiếu mylight đại diện cho object đèn nên có thể nhập nhằng gọi mylight là một object cũng được (ta hiểu là đang nói đến object mà mylight tham chiếu tới). Cú pháp gọi method (phương thức/chức năng/hành vi) ở trên là <tên object>.<tên method>; đoạn code mylight.TurnOn() thực hiện gửi yêu cầu "bật đèn" đến object mylight

Chú ý :
Mặc dù những gì ta làm khi lập trình hướng đối tượng là ‘tạo những kiểu dữ liệu mới’ (create new data types), thực tế mọi ngôn ngữ lập trình hướng đối tượng sử dụng từ khóa “class”. Khi bạn đọc từ “kiểu” (type), hãy xem như “lớp” (class); và ngược lại.

vuminhphan
19-09-2002, 07:20
hihi, bài viết hay lắm, danceswithwolves gửi thêm vài bài về C# nữa nhé!!! ;-)

danceswithwolves
19-09-2002, 11:59
cám ơn lời động viên (an ủi) của bạn... tớ sẽ cố.

phoenix
20-09-2002, 23:35
anh làm từ từ thôi cũng được, để tiếp thu được toàn bộ thì cũng cần có thời gian mà, thanks a lot, :)

vikhoa
21-09-2002, 00:12
Hay lắm, cứ viết tiếp đi, cho tớ học ké luôn. Tớ chưa biết gì về lập trình cả (trừ Pascal)

danceswithwolves
21-09-2002, 20:35
cái bác admin@ này tham lam quá, đã giỏi lắm thứ rồi vẫn còn ham...:) từ từ để tớ sống sót qua project (26/09) đã nhé...

danceswithwolves
21-09-2002, 20:41
Bài viết được gửi bởi phoenix
anh làm từ từ thôi cũng được, để tiếp thu được toàn bộ thì cũng cần có thời gian mà, thanks a lot, :)

Dạ, sức anh cũng có hạn thôi, muốn làm lẹ cũng không được... :) cám ơn em đã quan tâm động viên.

hueduongit
23-09-2002, 08:43
GOOD:exclaim: :exclaim: :exclaim:

hueduongit
23-09-2002, 09:00
GOOD:exclaim: :exclaim: :exclaim:

madcat
01-10-2002, 16:32
tui se post mot so bai ve VC ++ , ung ho DWW hoan toan --- tiep tuc di ,, tui dang can on lai mot so kien thuc ve oop

danceswithwolves
02-10-2002, 07:57
ừm, hãy làm box C/C++/C# sôi động hơn nữa nhé madcat@. Hy vọng bạn sẽ trở thành thành viên thường xuyên của box này. Bọn tớ chờ bài của bạn.