Class module - Kỹ thuật Tạo và Wrap đối lượng

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Class module là một kỹ thuật nâng cao để người phát triển tạo thêm cho mình những class/đối tượng hay "bao" một đối tượng.
Có 2 lý do sau buộc bạn phải viết class:
+ Tạo đối tượng giống nhau.
+ Gán thêm thuộc tính cho một control/đối tượng đã có (như là: Property, Method, Even).

Xem file đính kèm dưới đây các bạn sẽ hiểu thêm ý nghĩa của nó.

(Để học cách viết code trong Class module, các bạn hãy tìm các bài viết đã có trên diễn đàn này hoặc tìm đọc tài liệu lập trình Class trong VB/VBA trên mạng)
 

File đính kèm

  • clsButton.zip
    19.6 KB · Đọc: 2,955
Không có căn bản gì về class thì không nên theo chủ đề này.
Kỹ thuật "wrap đối tượng (theo tiêu đề thớt)" đòi hỏi trình độ tối thiểu là đã biết kha khá về lý thuyết lập trình hướng đối tượng.
 
Upvote 0
Không có căn bản gì về class thì không nên theo chủ đề này.
Kỹ thuật "wrap đối tượng (theo tiêu đề thớt)" đòi hỏi trình độ tối thiểu là đã biết kha khá về lý thuyết lập trình hướng đối tượng.
tới tận bây giờ em vẫn còn gà mờ đa xạ đa hình và tương ứng bội, em học cái này học tới học lui học suôi học ngược mà vẫn không tài nào hiểu rõ
 
Upvote 0
tới tận bây giờ em vẫn còn gà mờ đa xạ đa hình và tương ứng bội, em học cái này học tới học lui học suôi học ngược mà vẫn không tài nào hiểu rõ
Đa xạ (Interface?) là phần nối thêm của HĐT. Người ta thêm vào vì nó giải quyết được một số ngõ bí. Nó không hẳn là căn bản của HĐT.
Đa hình là phần khá khó ứng dụng. Lý thuyết thì dễ, nhưng thực hành cần khá nhiều kinh nghiệm.
Trong HĐT, cần nhất là tập trung vào tính chất đóng gói và tính trừu tượng.

Tính trưu tượng là cái bị hiểu lầm nhiều nhất, và vì hiểu lầm cho nên nó rất ít khi được áp dụng một cách hữu hiệu.
Điểm khó hiểu của tính trừu tượng là do từ "abstraction" dịch ra bị mất một phần ý nghĩa.
Bạn chỉ cần hiểu nó có nghĩa là "không mang hình tượng, thể chất cứng nhắc". Như khi sử dụng thành ngữ "đẹp như tiên"; bạn chỉ cần biết tiên có tính chất "đẹp" thôi. Việc cô tiên ở đâu ra không thành vấn đề.
Ví dụ tôi có lớp HocSinh, với các thuộc tính Toan, Ly, Hoa, Van, và TrungBinh.
Lớp này cho bạn biết rằng các thuộc tính kia sẽ là dạng số thực, và ở trong khoảng 0-10. Như vậy, lúc nạp thì bạn nạp số thực trong khoảng 0-10, và lúc truy xuất thì biết là mình sẽ nhận được số thực 0-10.
Nhưng bên trong, lớp HocSinh không hề hứa là nó sẽ chứa các điểm kia ở dạng gì. Là người thiết kế lớp, tôi có thể chứa nó ở dạng 5 biến. Một ngày đẹp trời, tôi đổi thành chỉ chứa 4 biến, và để cho TrungBinh tính từ 4 cái kia. Một ngày mưa, tôi lại đổi chứa chúng trong array. Một chiều nọ thua đề đậm, tôi đổi kiểu chứa thành dạng chuỗi. Là người sử dụng lớp, bạn không cần biết tôi thích mưa hay nắng, mê đề hay cá độ. Đối với bên ngoài, HocSinh luôn có 5 thuộc tính kiểu số thực 0-10; 4 có thể thay đổi được và 1 là trung bình của 4 cái kia.
Cái hay của "trừu tượng" là vậy. Nó cho phép bên thiết kế thay đổi thiết kế mà bên sủ dụng không cần biết tới.
 
Upvote 0
Đa hình là phần khá khó ứng dụng. Lý thuyết thì dễ, nhưng thực hành cần khá nhiều kinh nghiệm.
Có vẻ ông chú có định kiến với lập trình hướng đối tượng (OOP) nên thường nhìn tiêu cực cái hay của OOP. Theo tôi thì đa hình lại là cái vô cùng dễ ứng dụng và cho nhiều cảm hứng nhất khi làm việc trong lập trình hướng đối tượng vì nó tạo ra sự tương đồng với tư duy ngôn ngữ con người. Sự tương đồng ở đây chính là ý nghĩa của lệnh theo ngữ cảnh.

Trong ngôn ngữ con người, tùy theo ngữ cảch, từ "chạy" sẽ mang ý nghĩa là chuyển động cơ thể bằng chân, hoặc chuyển động của một cái xe. hay hoạt động của một cỗ máy... Với đa hình trong OOP, cùng một function, tùy vào dữ liệu đầu vào mà nó sẽ có những bước tính toán, thực thi tương ứng.

Chẳng hạn tôi lập function tính diện tích tam giác theo 2 cách:
  1. Theo chiều cao và cạnh đáy (2 tham số)
  2. Theo độ dài 3 cạnh (3 tham số)
Lập trình kiểu cũ, tôi sẽ phải nhớ đến 2 hàm tính riêng rẽ. Nhưng với tính đa hình của OOP thì tôi chỉ cần nhớ tới duy nhất một hàm tính diện tích và cái hàm ấy vô cùng ăn ý khi dựa vào dữ liệu đầu vào (dùng 2 hay 3 tham số) để tính sao cho phù hợp.
 
Lần chỉnh sửa cuối:
Upvote 0
...

Chẳng hạn tôi lập function tính diện tích tam giác theo 2 cách:
  1. Theo chiều cao và cạnh đáy (2 tham số)
  2. Theo độ dài 3 cạnh (3 tham số)
Lập trình kiểu cũ, tôi sẽ phải nhớ đến 2 hàm tính riêng rẽ. Nhưng với tính đa hình của OOP thì tôi chỉ cần nhớ tới duy nhất một hàm tính diện tích và cái hàm ấy vô cùng ăn ý khi dựa vào dữ liệu đầu vào (dùng 2 hay 3 tham số) để tính sao cho phù hợp.
Đó là hàm. Liên quan gì đến đối tượng của tôi?

Nếu tôi có lớp gì đó thể hiện được tam giác. Thì chưa chắc tôi đã cần biết nó có mấy hàm, bao nhiêu răng.
Rất có thể người thiết kế lớp này có một thuộc tính DienTich. Tôi chỉ cần truy vấn thuộc tính ấy. Chuyện nó dùng hàm gì để tính không phải là nơi tôi quan tâm.

Hay bạn muốn nói phương thức lớp (Static)?
Tôi không gọi tính chất hàm chồng là đa hình.
Đa hình đối với tôi tối thiểu phải là loại lớp đa giác. Đối tượng có thể là tam giác, tứ giác,... Và tuỳ theo nó là cái gì mà nó tự có cách tính diện tích khác nhau. (đây là mới nói hình học phẳng thôi)
 
Upvote 0
Đó là hàm. Liên quan gì đến đối tượng của tôi?
...
Hay bạn muốn nói phương thức lớp (Static)?
Tôi không gọi tính chất hàm chồng là đa hình.
Trước tiên cần nhắc lại là tôi chỉ đề cập về "Tính đa hình" cái mà được VetMini cho là "phần khá khó ứng dụng" chứ tôi chả lạm bàn về các vấn đề kỹ thuật khác trong OOP vì điều này ngoài khả năng của tôi.

Để tránh phán bậy về OOP do đọc đã quá lâu, tôi đã phải search "tính đa hình" để bảo đảm là những thông tin tôi nói ở đây là đủ tin cậy. Tôi xin dẫn một đoạn tài liệu về khái niệm "tính đa hình" để mọi người có thể đối chiếu với ý niệm cũng như minh họa của tôi ở # trên:
From Google đã viết:
Trong tiếng Hy Lạp, thuật ngữ “polymorphism” mang ý nghĩa là “có nhiều dạng”. Tương tự, trong lập trình thuật ngữ này dùng để ám chỉ đến việc một biến, một hàm hoặc một phương thức có thể tồn tại ở nhiều dạng khác nhau. Tức là nhiều hàm hoặc phương thức có thể cùng một tên nhưng chức năng thực sự của chúng lại khác nhau.
Không biết là khái niệm về "tính đa hình" nầy có khác những gì mà chú VetMini vẫn đinh ninh lâu nay không?
 
Lần chỉnh sửa cuối:
Upvote 0
Đa hình đối với tôi tối thiểu phải là loại lớp đa giác. Đối tượng có thể là tam giác, tứ giác,... Và tuỳ theo nó là cái gì mà nó tự có cách tính diện tích khác nhau. (đây là mới nói hình học phẳng thôi)
dạ theo hiểu biết tạm tạm của em thì ý của em cũng giống như của thầy. Em có xem các clip này thầy Khang cũng giảng giống như ý thầy. mà do em còn gà mờ quá nên học hoài vẫn chưa thông nên phải làm trâu gặm nhắm từ từ
Liên kết: https://www.youtube.com/watch?v=pDY8rREVJ6s&list=PLjzaUXKQiFUTUjmu0Z8Sp2-gf0hzIxXbZ&index=28
 
Upvote 0
dạ theo hiểu biết tạm tạm của em thì ý của em cũng giống như của thầy. Em có xem các clip này thầy Khang cũng giảng giống như ý thầy. mà do em còn gà mờ quá nên học hoài vẫn chưa thông nên phải làm trâu gặm nhắm từ từ
...
Cha nội TS này nói tiếng Anh khá dở mà lúc nói bày đặt ô kê, ô kiếc tùm lum.
Người Việt có tật hay chêm tiếng ngoại vào câu nói mà nhiều lúc không biết rằng những tiếng ấy là cách dùng của dân đầu trâu mặt ngựa.

poly = nhiều
morph = cách trình bày tắt của metamorphosis = thay đổi hình dạng
ism = tiếp vỹ ngữ dùng để chỉ phương cách, đường lối, chính sách,...
Như vậy polymorphism dịch là đa hình đủ rồi. Mấy cha nội bày đặt đa xạ, tương ứng bội,... càng làm rối rắm.
Cũng như "trừu tượng" tôi nêu ra trước đây, có dịch hơi trệch chút cũng chả chết ai, cái quan trọng là "biết nó như vậy". Chiếc xe hơi ai cũng biết nó là xe hơi - cần gì phải chứng mình nó "hơi" ở đâu.

Bạn thấy khó hiểu bởi vì cái cơ líp trên dùng ví dụ trong C++. Trong các ngôn ngữ HĐT thì C++ là khó sử dụng nhất. Chọn cái khó để dạy cái khó hiểu thì chết học sinh. Vậy thôi.
(ngày xưa, chỉ để hiểu lớp ảo và bảng ảo tôi đã phải điên đầu với nó)

Bạn học cách áp dụng đa hình của các ngôn ngữ cận đại hơn (như Python) sẽ thấy dễ hiểu hơn nhiều.
 
Upvote 0
Bạn học cách áp dụng đa hình của các ngôn ngữ cận đại hơn (như Python) sẽ thấy dễ hiểu hơn nhiều.
Cận đại chắc là gần như hiện đại chăng ? Vậy có ngôn ngữ nào hiện đại hẳn hoi luôn không anh, để em dễ hiểu hơn nữa ạ ?
 
Upvote 0
Cận đại chắc là gần như hiện đại chăng ? Vậy có ngôn ngữ nào hiện đại hẳn hoi luôn không anh, để em dễ hiểu hơn nữa ạ ?
Hiện đại là up-to-date. Cận đại là recent. Muốn diễn đạt thằng nào thì diễn.

Trong ngữ cảnh của ngôn ngữ thì cận đại có nghĩa là trẻ hơn (more recent/modern), hiện đại có nghĩa gần như đang được hâm mộ (curently in favour).
 
Upvote 0
Class module là một kỹ thuật nâng cao để người phát triển tạo thêm cho mình những class/đối tượng hay "bao" một đối tượng.
Có 2 lý do sau buộc bạn phải viết class:
+ Tạo đối tượng giống nhau.
+ Gán thêm thuộc tính cho một control/đối tượng đã có (như là: Property, Method, Even).

Xem file đính kèm dưới đây các bạn sẽ hiểu thêm ý nghĩa của nó.

(Để học cách viết code trong Class module, các bạn hãy tìm các bài viết đã có trên diễn đàn này hoặc tìm đọc tài liệu lập trình Class trong VB/VBA trên mạng)
e chào anh, e đã đọc được tính ưu việt mà class module có thể mang lại, nhưng trên mạng tài liệu về class module cho VBA khó kiếm quá,
anh có thể chia sẻ cho em tài liệu này được không ah, (email của e là nguyenxuanvung@gmail.com)
 
Upvote 0
Tiếp tục đào lại "tính đa hình" trong OOP thì tôi thấy có nguồn tài liệu phân chia nó thành 2 loại:

[1] Compile time Polymorphism. sử dụng bằng cách nạp chồng hàm hoặc nạp chồng toán tử.
Đây chính là "tính đa hình" mà tôi đã đề cập tới và có tính ứng dụng rất cao nhưng lại được chú VetMini chê bai . Rất nhiều các hàm trong .NET, Java và MQL4 chấp nhận các hình thức truyền tham số khác nhau cho cùng một hàm. Nó rất hữu ích vì coder sẽ không cần phải nhớ quá nhiều tên hàm. Với một tên hàm, chỉ cần gõ cái dấu mở ngoặc tròn thì sẽ có nhiều gợi ý truyền tham số để ta thoải mái lựa chọn thích hợp với dữ liệu đang có. Viết các dạng hàm, toán tử loại này cũng tương tự như viết các hàm thông thường chứ không có gì phức tạp hơn.​
[2] Runtime Polymorphism. nẩy sinh khi tạo ra một lớp kế thừa (?).
Có lẽ chú VetMini bị đóng đinh vào cái "đa hình"này nên quên luôn "tính đa hình" lý thú ở trên tuy nhiên cũng phải nói là nó không đến nỗi khó hiểu. Đúng là loại đa hình này ít có ứng dụng với khi viết app vừa vừa, thông thường.​
 
Upvote 0
e chào anh, e đã đọc được tính ưu việt mà class module có thể mang lại, nhưng trên mạng tài liệu về class module cho VBA khó kiếm quá,
anh có thể chia sẻ cho em tài liệu này được không ah, (email của e là nguyenxuanvung@gmail.com)

Bạn tải các ví dụ tôi gửi ở các bài trên cùng, với từ khoá “class in VB6” bạn chịu tìm trên Google để tự học thêm nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom