text:
Bông hồng vàng của Pautovxki và những câu ca dao đầy nước mắt của người bà lẻ loi ru đứa cháu ngoại đã dẫn tôi đi về phía chân trời văn chương. Từ đấy, sau bao nhiêu năm sống, học và đem những điều “hạnh ngộ” được từ Văn lẫn Đời đến với học sinh, tôi đã dừng lại, trong một khoảnh khắc dường như chẳng có một sự đa cảm nào hết, chẳng có một chút lý trí nào hết, tôi bắt đầu nhận ra công việc của mình: công việc dạy văn.
Và băn khoăn tự hỏi: Đấy là Nghề hay Nghiệp ?
Tất nhiên, dạy văn như bao công việc dạy các môn học khác, cho dù nấp bóng dưới những hình thức thiêng liêng nào thì cũng không thoát ra khỏi phạm trù nghề. Trên bục giảng, trong bốn mươi lăm phút định mệnh ngắn ngủi của một giờ dạy, trước cuộc hội ngộ diệu kỳ giữa nhà văn – tác phẩm và những công dân tương lai, người làm nghề dạy văn không thể chối từ nhiệm vụ phải đem lại cho học sinh những gì cần thiết của tri thức văn.
Dạy văn là một nghề cực khó, vì thế từ trước đến nay ít ai ngây thơ dũng cảm dám tự thị khẳng định mình ở lĩnh vực này. Dạy văn là một nghề mà thành công thường đầy bất trắc. Đôi khi chính anh tự tưởng thưởng cảm giác Narcis cho mình,… nhưng học trò thì ngơ ngác.
Ở một phía khác, tiếng gọi của văn chương là tiếng gọi của một sứ mệnh đồng vọng. Trong ý nghĩa khởi đầu, tác phẩm văn học – “đám tinh vân” lạ lùng bằng ngôn từ là một duyên cớ để nhà văn giãi bày và tìm kiếm sự đồng cảm với đời. Song những vang vọng trong tâm hồn ấy có va đập vào những sâu thẳm của trái tim đồng loại hay không, “đồng thanh tương ứng, đồng khí tương cầu”, cùng nhà văn, người dạy văn phải sống và phải biết đau khổ, biết chia sẻ những lo toan ấy trước cuộc đời và con người về tất thảy.
Không chọn một số phận nào dễ dàng hơn số phận những “kẻ khóc mướn vĩ đại”, nhà văn và người dạy văn đã cùng chung nghiệp lực !
Ở đó những nỗi đau khổ âm thầm bất lực trước sự giải thích cái Đẹp lẫn những suy ngẫm nhân thế sâu xa làm quằn quại tâm thức ra đời. Ở đó, những đôi mắt ngây thơ giữa sự huyên náo cuồn cuộn đầy màu sắc ở ngoài cuộc đời xanh tươi, cả những bất ổn đầy xô giạt của một tâm hồn người dễ bị man trá giữa đời thực cần được bảo vệ. Làm sao sinh thành được những cuộc gặp gỡ miên viễn giữa trang văn, học trò và chính mình ? Nếu được thế, người dạy văn đã đong thêm được trong lòng mình một hạnh phúc vô bờ. Nhưng đấy nhiều khi chỉ là những khoảnh khắc. Còn lại phía sau là cả cuộc đời mà sự yên lặng đến cô đơn và nghèo khổ bao đêm trước gia đình và trang giấy. Tất cả cộng lại thành một thân phận, một nghiệp chướng ?!
Từ đấy, nỗi “phong vận kỳ oan ngã tự cư” tiền kiếp đã đeo đẳng người giáo viên văn một cách chung tình. Cũng từ đấy, anh vẫn phải đi tìm bản chất uyên nguyên của đời sống bằng lý tính của văn lẫn đời, nhưng không thể lừa dối mình bằng sự bỏ qua những cảm xúc sống động của hiện thể đang trải trong từng giây phút một, để người giáo viên dạy văn trở thành sứ giả của cái Đẹp đi gieo sự giao cảm giữa Đời trên những mầm cây ngây thơ đang lớn với vẻ đẹp “chi sơ” mong manh khó giao thoa, nắm bắt.
Luôn cố gắng đạt tới một sự hoàn mỹ, dạy văn trong sự bất lực của tâm dễ chuyển thành nỗi đau vô ngôn. Phải chăng đấy cũng là mối liên hệ giữa Nghề và Nghiệp trong công việc dạy văn ?
Rồi có thể những lời giảng của người dạy văn sống được một cuộc đời dài trong lòng người đi sau, hoặc chết yểu tự lúc khai sinh ? Có thể những cố gắng của chúng ta trở thành vô ích ? Nhưng dù băn khoăn hoài nghi thế nào đi nữa, chúng ta cũng tin yêu và biết ơn số mệnh vì đã cho chúng ta sự chung tình với Đời, với Người.
Trước thềm xuân mới, vu vơ, con người lại nghĩ về mình như một sự giãi bày tâm thức trước dòng chảy thời gian, và cũng muốn tất thảy đi tìm một sự lượng thứ và đồng cảm cho nhau trong đời…
Không ngoài ước nguyện dâng hiến trước Xuân !
Đà Nẵng, Xuân Giáp Tuất – ngày 06 tháng 12 năm 1994
Gửi phản hồi

markdown:
Bông hồng vàng của Pautovxki và những câu ca dao đầy nước mắt của người bà lẻ loi ru đứa cháu ngoại đã dẫn tôi đi về phía chân trời văn chương. Từ đấy, sau bao nhiêu năm sống, học và đem những điều “hạnh ngộ” được từ Văn lẫn Đời đến với học sinh, tôi đã dừng lại, trong một khoảnh khắc dường như chẳng có một sự đa cảm nào hết, chẳng có một chút lý trí nào hết, tôi bắt đầu nhận ra công việc của mình:
*công việc dạy văn*.
Và băn khoăn tự hỏi:
*Đấy là Nghề hay Nghiệp ?* *phạm trù nghề*. Trên bục giảng, trong bốn mươi lăm phút định mệnh ngắn ngủi của một giờ dạy, trước cuộc hội ngộ diệu kỳ giữa *nhà văn – tác phẩm và những công dân tương lai*, người làm nghề dạy văn không thể chối từ nhiệm vụ phải đem lại cho học sinh những gì cần thiết của tri thức văn.
Dạy văn là một nghề cực khó, vì thế từ trước đến nay ít ai ngây thơ dũng cảm dám tự thị khẳng định mình ở lĩnh vực này. Dạy văn là một nghề mà thành công thường đầy bất trắc. Đôi khi chính anh tự tưởng thưởng cảm giác Narcis cho mình,… nhưng học trò thì ngơ ngác.
Ở một phía khác, tiếng gọi của văn chương là tiếng gọi của một sứ mệnh đồng vọng. Trong ý nghĩa khởi đầu, tác phẩm văn học – “đám tinh vân” lạ lùng bằng ngôn từ là một duyên cớ để nhà văn giãi bày và tìm kiếm sự đồng cảm với đời. Song những vang vọng trong tâm hồn ấy có va đập vào những sâu thẳm của trái tim đồng loại hay không, “đồng thanh tương ứng, đồng khí tương cầu”, cùng nhà văn, người dạy văn phải sống và phải biết đau khổ, biết chia sẻ những lo toan ấy trước cuộc đời và con người về tất thảy.
Không chọn một số phận nào dễ dàng hơn số phận những “kẻ khóc mướn vĩ đại”, nhà văn và người dạy văn đã cùng chung nghiệp lực !
Ở đó những nỗi đau khổ âm thầm bất lực trước sự giải thích cái Đẹp lẫn những suy ngẫm nhân thế sâu xa làm quằn quại tâm thức ra đời. Ở đó, những đôi mắt ngây thơ giữa sự huyên náo cuồn cuộn đầy màu sắc ở ngoài cuộc đời xanh tươi, cả những bất ổn đầy xô giạt của một tâm hồn người dễ bị man trá giữa đời thực cần được bảo vệ. Làm sao sinh thành được những cuộc gặp gỡ miên viễn giữa trang văn, học trò và chính mình ? Nếu được thế, người dạy văn đã đong thêm được trong lòng mình một hạnh phúc vô bờ. Nhưng đấy nhiều khi chỉ là những khoảnh khắc. Còn lại phía sau là cả cuộc đời mà sự yên lặng đến cô đơn và nghèo khổ bao đêm trước gia đình và trang giấy. Tất cả cộng lại thành một thân phận, một nghiệp chướng ?!
Từ đấy, nỗi “phong vận kỳ oan ngã tự cư” tiền kiếp đã đeo đẳng người giáo viên văn một cách chung tình. Cũng từ đấy, anh vẫn phải đi tìm bản chất uyên nguyên của đời sống bằng lý tính của văn lẫn đời, nhưng không thể lừa dối mình bằng sự bỏ qua những cảm xúc sống động của hiện thể đang trải trong từng giây phút một, để người giáo viên dạy văn trở thành sứ giả của cái Đẹp đi gieo sự giao cảm giữa Đời trên những mầm cây ngây thơ đang lớn với vẻ đẹp “chi sơ” mong manh khó giao thoa, nắm bắt.
Luôn cố gắng đạt tới một sự hoàn mỹ, dạy văn trong sự bất lực của tâm dễ chuyển thành nỗi đau vô ngôn. Phải chăng đấy cũng là mối liên hệ giữa Nghề và Nghiệp trong công việc dạy văn ?
Rồi có thể những lời giảng của người dạy văn sống được một cuộc đời dài trong lòng người đi sau, hoặc chết yểu tự lúc khai sinh ? Có thể những cố gắng của chúng ta trở thành vô ích ? Nhưng dù băn khoăn hoài nghi thế nào đi nữa, chúng ta cũng tin yêu và biết ơn số mệnh vì đã cho chúng ta sự chung tình với Đời, với Người.
Trước thềm xuân mới, vu vơ, con người lại nghĩ về mình như một sự giãi bày tâm thức trước dòng chảy thời gian, và cũng muốn tất thảy đi tìm một sự lượng thứ và đồng cảm cho nhau trong đời…
Không ngoài ước nguyện dâng hiến trước Xuân !
**Đà Nẵng, Xuân Giáp Tuất – ngày 06 tháng 12 năm 1994**
## Gửi phản hồi Hủy trả lời

Link: <http://wp.me/pPlHO-2l>; rel=shortlink


text:
Trung tâm dịch vụ internet – mạng cáp quang Viettel Đà Nẵng
Một trung tâm kinh tế, du lịch lớn như Đà Nẵng luôn cần một hạ tầng internet tốt để phát triển, bất kể bạn là hộ gia đình hay doanh nghiệp. Hiểu được điều này, Viettel Đà Nẵng luôn quan tâm, chú trọng phát triển hạ tầng cáp quang Viettel tại Đà Nẵng ngày một tốt hơn để phục vụ nhu cầu của các hộ gia đình, trung tâm và doanh nghiệp với mức chi phí phù hợp với nhu cầu và quan trọng là tốc độ luôn được đảm bảo.
Quý khách có thể tham khảo bảng giá cáp quang Viettel tại đây để biết thêm chi tiết. Ngoài ra, nhân viên chúng tôi sẽ tư vấn cho quý khách gói cước phù hợp nhất và đăng ký lắp đặt thông qua tổng đài 0971.423.424.
Bảng giá cáp quang Viettel
Đối với các hộ gia đình, có thể chọn gói cước từ 10 đến 15Mbps để sử dụng tiết kiệm nhất. Nếu đông thành viên, từ 3 người trở lên thì nên chọn gói cước 15Mbps trở lên sẽ có tốc độ tốt nhất khi sử dụng cùng lúc. Bảng giá đã bao gồm 10% VAT.
Tổng đài tư vấn lắp đặt: 0971.423.424
Dịch vụ lắp cáp quang Viettel tại Đà Nẵng
Quy trình mà Viettel áp dụng cho khách hàng là đơn giản và thuận tiện nhất, giúp cho khách hàng đăng ký dịch vụ nhanh chóng và có thể sử dụng trong vòng 24 – 48 giờ. Thời gian kí hợp đồng cũng nhanh chóng nhất với giấy tờ đơn giản để quý khách thể hoàn thành nhanh chóng hợp đồng trong 15 phút. Quý khách có thể tham khảo các bước mà nhân viên Viettel sẽ hỗ trợ:
- Nhận thông tin đăng ký của khách hàng qua tổng đài 0971.423.424.
- Tiến hành khảo sát hạ tầng nơi khách hàng cần lắp đặt.
- Báo cho khách hàng biết kết quả khảo sát, các chi phí và giấy tờ cần chuẩn bị. Nếu khách hàng đồng ý sẽ cử nhân viên xuống kí hợp đồng ngay trong ngày.
- Lắp đặt mạng cho khách hàng trong khoảng từ 24 – 48 giờ sau khi kí hợp đồng.
Câu hỏi thường gặp
Tôi phải đóng bao nhiêu tiền phí lắp đặt và tiền modem?
Khi đóng trước 6 tháng cước, Viettel sẽ miễn phí hoàn toàn phí lắp đặt và modem, quý khách không cần đóng thêm bất kì chi phí nào khác. Nếu không đóng trước, quý khách vui lòng liên hệ tổng đài để được tư vấn kĩ hơn.cap quang viettel tai da nang, my viettel, wifi vpnt

markdown:
# Trung tâm dịch vụ internet – mạng cáp quang Viettel Đà Nẵng
[Cáp quang Viettel](https://tuvangoicuoc.com/goi-cuoc-internet/viettel/)
Một trung tâm kinh tế, du lịch lớn như Đà Nẵng luôn cần một hạ tầng internet tốt để phát triển, bất kể bạn là hộ gia đình hay doanh nghiệp. Hiểu được điều này, Viettel Đà Nẵng luôn quan tâm, chú trọng phát triển hạ tầng cáp quang Viettel tại Đà Nẵng ngày một tốt hơn để phục vụ nhu cầu của các hộ gia đình, trung tâm và doanh nghiệp với mức chi phí phù hợp với nhu cầu và quan trọng là tốc độ luôn được đảm bảo.
Quý khách có thể tham khảo bảng giá cáp quang Viettel tại đây để biết thêm chi tiết. Ngoài ra, nhân viên chúng tôi sẽ tư vấn cho quý khách gói cước phù hợp nhất và đăng ký lắp đặt thông qua tổng đài 0971.423.424.
### Bảng giá cáp quang Viettel
Đối với các hộ gia đình, có thể chọn gói cước từ 10 đến 15Mbps để sử dụng tiết kiệm nhất. Nếu đông thành viên, từ 3 người trở lên thì nên chọn gói cước 15Mbps trở lên sẽ có tốc độ tốt nhất khi sử dụng cùng lúc.
*Bảng giá đã bao gồm 10% VAT*. __Tổng đài tư vấn lắp đặt:__ *0971.423.424*
|Gói 10M||Gói 15M||Gói 20M||Gói 25M||Gói 30M|
|Cáp quang|
|Modem wifi|
|Giá cước/tháng||165.000đ||180.000đ||200.000đ||220.000đ||250.000đ|
|Chi phí lắp đặt|Miễn phí
Khi đóng trước 6 tháng
### Dịch vụ lắp cáp quang Viettel tại Đà Nẵng
Quy trình mà Viettel áp dụng cho khách hàng là đơn giản và thuận tiện nhất, giúp cho khách hàng đăng ký dịch vụ nhanh chóng và có thể sử dụng trong vòng 24 – 48 giờ. Thời gian kí hợp đồng cũng nhanh chóng nhất với giấy tờ đơn giản để quý khách thể hoàn thành nhanh chóng hợp đồng trong 15 phút. Quý khách có thể tham khảo các bước mà nhân viên Viettel sẽ hỗ trợ:
- Nhận thông tin đăng ký của khách hàng qua tổng đài 0971.423.424.
- Tiến hành khảo sát hạ tầng nơi khách hàng cần lắp đặt.
- Báo cho khách hàng biết kết quả khảo sát, các chi phí và giấy tờ cần chuẩn bị. Nếu khách hàng đồng ý sẽ cử nhân viên xuống kí hợp đồng ngay trong ngày.
- Lắp đặt mạng cho khách hàng trong khoảng từ 24 – 48 giờ sau khi kí hợp đồng.
### Câu hỏi thường gặp
*Tôi phải đóng bao nhiêu tiền phí lắp đặt và tiền modem?*
Khi đóng trước 6 tháng cước, Viettel sẽ miễn phí hoàn toàn phí lắp đặt và modem, quý khách không cần đóng thêm bất kì chi phí nào khác. Nếu không đóng trước, quý khách vui lòng liên hệ tổng đài để được tư vấn kĩ hơn.
*cap quang viettel tai da nang, my viettel, wifi vpnt*

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Server: nginx

Content-Type: text/html; charset=UTF-8

Connection: close

Vary: Accept-Encoding

X-SRCache-Fetch-Status: MISS

X-SRCache-Store-Status: STORE


text:
Corybas
Bách khoa toàn thư mở Wikipedia
Corybas là một chi nhỏ chứa các loài phong lan (họ Orchidaceae), được đặt tên theo một vị thần của Samothrace là Corybas.
Các loài[sửa | sửa mã nguồn]
- Corybas acuminatus (New Zealand).
- Corybas cheesemanii, Spurred helmet orchid (New Zealand).
- Corybas diemenicus (Australia).
- Corybas fimbriatus, Fringed helmet orchid (Australia).
- Corybas kaimai (New Zealand).
- Corybas macranthus, Spider orchid (New Zealand).
- Corybas oblongus (New Zealand).
- Corybas trilobus, Spider orchid (New Zealand).
- Corybas unguiculatus, Small helmet orchid (Australia).
-
Danh sách này không đầy đủ; bạn có thể giúp đỡ bằng cách mở rộng nó.

markdown:
# Corybas
Bách khoa toàn thư mở Wikipedia
|
|Corybas
|
|![]()
*Corybas pictus* [Phân loại khoa học](/wiki/Ph%C3%A2n_lo%E1%BA%A1i_sinh_h%E1%BB%8Dc) [Giới](/wiki/Gi%E1%BB%9Bi_(sinh_h%E1%BB%8Dc))( *regnum*) [Plantae](/wiki/Th%E1%BB%B1c_v%E1%BA%ADt) [Angiospermae](/wiki/Th%E1%BB%B1c_v%E1%BA%ADt_c%C3%B3_hoa) [Monocots](/wiki/Th%E1%BB%B1c_v%E1%BA%ADt_m%E1%BB%99t_l%C3%A1_m%E1%BA%A7m) [Bộ](/wiki/B%E1%BB%99_(sinh_h%E1%BB%8Dc))( *ordo*) [Asparagales](/wiki/B%E1%BB%99_M%C4%83ng_t%C3%A2y) [Họ](/wiki/H%E1%BB%8D_(sinh_h%E1%BB%8Dc))( *familia*) [Orchidaceae](/wiki/H%E1%BB%8D_Lan) [Phân họ](/wiki/Ph%C3%A2n_h%E1%BB%8D)( *subfamilia*) [Orchidoideae](/wiki/Ph%C3%A2n_h%E1%BB%8D_Lan) [Tông](/wiki/T%C3%B4ng_(sinh_h%E1%BB%8Dc))( *tribus*) [Diurideae](/w/index.php?title=Diurideae&action=edit&redlink=1) [Phân tông](/wiki/Ph%C3%A2n_t%C3%B4ng)( *subtribus*) [Acianthinae](/w/index.php?title=Acianthinae&action=edit&redlink=1) [Chi](/wiki/Chi_(sinh_h%E1%BB%8Dc))( *genus*) **Corybas** [Salisb.](/w/index.php?title=Richard_Anthony_Salisbury&action=edit&redlink=1) ![ Corybas distribution map.png](//upload.wikimedia.org/wikipedia/commons/thumb/a/af/Corybas_distribution_map.png/280px-Corybas_distribution_map.png)
![ Corybas distribution map.png](http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Corybas_distribution_map.png/280px-Corybas_distribution_map.png)
[Các loài](/wiki/Lo%C3%A0i)
Xem trong bài.
[Danh pháp đồng nghĩa](/wiki/T%C3%AAn_%C4%91%E1%BB%93ng_ngh%C4%A9a_(sinh_v%E1%BA%ADt_h%E1%BB%8Dc)) [[1]](#cite_note-i-1)
Danh sách
*Corysanthes*R.Br. *Calcearia*Blume *Nematoceras*Hook.f. *Anzybas*D.L.Jones & M.A.Clem. *Gastrosiphon*(Schltr.) M.A.Clem. & D.L.Jones *Molloybas*D.L.Jones & M.A.Clem. *Singularybas*Molloy, D.L.Jones & M.A.Clem. * là một chi nhỏ chứa các loài Corybas* [phong lan](/wiki/H%E1%BB%8D_Lan)(họ Orchidaceae), được đặt tên theo một vị thần của [Samothrace](/w/index.php?title=Samothrace&action=edit&redlink=1)là Corybas.
## Các loài[
[sửa](/w/index.php?title=Corybas&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Corybas&action=edit§ion=1)] *(New Zealand).* [Corybas acuminatus](/wiki/Corybas_acuminatus) *, Spurred helmet orchid (New Zealand).* [Corybas cheesemanii](/wiki/Corybas_cheesemanii) *(Australia).* [Corybas diemenicus](/wiki/Corybas_diemenicus) *, Fringed helmet orchid (Australia).* [Corybas fimbriatus](/wiki/Corybas_fimbriatus) *(New Zealand).* [Corybas kaimai](/w/index.php?title=Corybas_kaimai&action=edit&redlink=1) *, Spider orchid (New Zealand).* [Corybas macranthus](/wiki/Corybas_macranthus) *(New Zealand).* [Corybas oblongus](/wiki/Corybas_oblongus) *, Spider orchid (New Zealand).* [Corybas trilobus](/wiki/Corybas_trilobus) *, Small helmet orchid (Australia).* [Corybas unguiculatus](/wiki/Corybas_unguiculatus)
-
*Danh sách này*. [không đầy đủ](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Danh_s%C3%A1ch_kh%C3%B4ng_%C4%91%E1%BA%A7y_%C4%91%E1%BB%A7); bạn có thể giúp đỡ bằng cách [mở rộng nó](//vi.wikipedia.org/w/index.php?title=Corybas&action=edit)
## Tham khảo[
[sửa](/w/index.php?title=Corybas&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=Corybas&action=edit§ion=2)]
## Liên kết ngoài[
[sửa](/w/index.php?title=Corybas&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=Corybas&action=edit§ion=3)]
|
|![]()
|Wikimedia Commons có thêm hình ảnh và phương tiện truyền tải về
|Corybas

Set-Cookie: GeoIP=US:VA:Ashburn:39.05:-77.47:v4; Path=/; secure; Domain=.wikipedia.org

X-Content-Type-Options: nosniff

Cache-Control: private, s-maxage=0, max-age=0, must-revalidate

X-Cache-Status: hit

P3P: CP="This is not a P3P policy! See https://vi.wikipedia.org/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:CentralAutoLogin/P3P for more info."

Via: 1.1 varnish-v4, 1.1 varnish-v4

Content-Language: vi

X-UA-Compatible: IE=Edge

X-Cache: cp1053 hit/1, cp1053 miss

Vary: Accept-Encoding,Cookie,Authorization

Accept-Ranges: bytes


text:
Herbitzheim
Bách khoa toàn thư mở Wikipedia
Tọa độ: 49°00′56″B 7°05′06″Đ / 49,01555556°B 7,085°Đ
Herbitzheim là một xã thuộc tỉnh Bas-Rhin trong vùng Alsace đông bắc Pháp.
Tọa độ: 49°00′56″B 7°05′06″Đ / 49,01555556°B 7,085°Đ
Herbitzheim là một xã thuộc tỉnh Bas-Rhin trong vùng Alsace đông bắc Pháp.

markdown:
# Herbitzheim
Bách khoa toàn thư mở Wikipedia
[Tọa độ](/wiki/H%E1%BB%87_t%E1%BB%8Da_%C4%91%E1%BB%99_%C4%91%E1%BB%8Ba_l%C3%BD): [49°00′56″B 7°05′06″Đ / 49,01555556°B 7,085°Đ](//tools.wmflabs.org/geohack/geohack.php?language=vi&pagename=Herbitzheim¶ms=49.01555556_N_7.085_E_region:FR-67_type:city(1957))
|
|
|Hành chính|
|
| ![ Quốc kỳ Pháp](//upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/18px-Flag_of_France.svg.png)
![ Quốc kỳ Pháp](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/18px-Flag_of_France.svg.png)
[Pháp](/wiki/Ph%C3%A1p) [Vùng](/wiki/V%C3%B9ng_c%E1%BB%A7a_Ph%C3%A1p) [Alsace](/wiki/Alsace) [Tỉnh](/wiki/T%E1%BB%89nh_c%E1%BB%A7a_Ph%C3%A1p) [Bas-Rhin](/wiki/Bas-Rhin) [Quận](/wiki/Qu%E1%BA%ADn_c%E1%BB%A7a_Ph%C3%A1p) [Saverne](/wiki/Saverne_(qu%E1%BA%ADn)) [Tổng](/wiki/T%E1%BB%95ng_c%E1%BB%A7a_Ph%C3%A1p) [Xã (thị) trưởng](/wiki/Th%E1%BB%8B_tr%C6%B0%E1%BB%9Fng)
(1989–2008)
[Độ cao](/wiki/Cao_%C4%91%E1%BB%99) 1 2(8,39 sq mi) [Nhân khẩu](/wiki/Nh%C3%A2n_kh%E1%BA%A9u_Ph%C3%A1p) 2 [Mật độ](/wiki/M%E1%BA%ADt_%C4%91%E1%BB%99_d%C3%A2n_s%E1%BB%91) 2(230 /sq mi) [INSEE](/wiki/M%C3%A3_INSEE)/Mã bưu chính [67191](http://recensement.insee.fr/searchResults.action?zoneSearchField=&codeZone=67191-COM)/ [67260](/wiki/Danh_s%C3%A1ch_c%C3%A1c_m%C3%A3_b%C6%B0u_ch%C3%ADnh_%E1%BB%9F_Ph%C3%A1p) 1Dữ liệu địa chính Pháp loại trừ các hồ và ao lớn hơn 1 km² (0.386 dặm vuông hoặc 247 [acre](/wiki/Acre)) cũng như các cửa sông. 2 *Dân số không tính hai lần*: cư dân của nhiều xã (ví dụ, các sinh viên và quân nhân) chỉ tính một lần. **Herbitzheim** là một [xã](/wiki/X%C3%A3_c%E1%BB%A7a_Ph%C3%A1p) thuộc [tỉnh](/wiki/T%E1%BB%89nh_(Ph%C3%A1p)) [Bas-Rhin](/wiki/Bas-Rhin) trong [vùng](/wiki/V%C3%B9ng_c%E1%BB%A7a_Ph%C3%A1p) [Alsace](/wiki/Alsace) đông bắc [Pháp](/wiki/Ph%C3%A1p).

X-Cache: cp1066 hit/1, cp1053 miss


text:
Lập trình hướng đối tượng
Lập trình hướng đối tượng (gọi tắt là OOP, từ chữ Anh ngữ object-oriented programming), hay còn gọi là lập trình định hướng đối tượng, là kĩ thuật lập trình hỗ trợ công nghệ đối tượng. OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn. Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là các phương pháp trước đó.
Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là tương tác với các đối tượng vật lý.
Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường.
Mục lục
- 1 Các tính chất cơ bản
- 2 Một điểm mới về mẫu hình, về quan điểm
- 3 Các mẫu hình định hướng đối tượng con
- 4 Định nghĩa chuẩn
- 5 OOP trong văn lệnh
- 6 Ví dụ mã nguồn trong C++
- 7 Một số khái niệm cần biết trong ngôn ngữ OOP hiện đại
- 8 Bảo tồn (protected)
- 9 Lịch sử
- 10 Các ngôn ngữ
- 11 Đọc thêm
- 12 Các bài liên hệ
- 13 Tham khảo
Các tính chất cơ bản[sửa | sửa mã nguồn]
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ó 4 tính chất chính sau:
-
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 lớp cơ sở trừu tượng.
-
Tính đóng gói (encapsulation) và che giấ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.
-
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.
-
- Ví 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".
-
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.
Một điểm mới về mẫu hình, về quan điểm[sửa | sửa mã nguồn]
OOP vẫn còn là một đề tài của nhiều tranh cãi về định nghĩa chuẩn xác hay về các nguyên lý của nó.
Trong dạng tổng quát nhất, OOP được hiểu theo cách là một loại thực nghiệm viết chương trình văn bản được phân cấp ra thành nhiều mô đun (module), mà mỗi mô đun đóng vai như một lớp vỏ che đại diện cho mỗi kiểu dữ liệu.
Những khái niệm liên hệ đã được góp nhặt lại để tạo thành một khuôn khổ cho việc lập trình. Các triết lý đằng sau việc định hướng đối tượng đã trở nên mạnh mẽ để tạo thành một sự chuyển đổi mẫu hình trong ngành lập trình.
Những mẫu hình khác như lập trình chức năng và lập trình thủ tục tập trung chủ yếu trên các hành động, còn lập trình lô gíc lại tập trung vào những khẳng định hợp lý để kích hoạt sự thực thi của mã chương trình.
OOP đã phát triển một cách độc lập từ việc nghiên cứu về các ngôn ngữ định hướng của hệ thống mô phỏng, đó là SIMULA 67, và từ việc nghiên cứu các kiến trúc của hệ thống có độ tin cậy cao, đó là các kiến trúc CPU và khả năng cơ bản của các hệ điều hành.
Một chức năng đặc sắc của OOP là việc xử lý các kiểu con của các kiểu dữ liệu.
Dữ liệu của các đối tượng, một cách tổng quát, được đòi hỏi trong thiết kế để thỏa mãn các yêu cầu của người lập trình (tức là các lớp).
Các kiểu dữ liệu bị giới hạn thêm các điều kiện mặc dù có cùng kiểu dữ liệu với loại không bị ràng buộc bởi các điều kiện đó, gọi là kiểu dữ liệu con. Cả hai loại kiểu dữ liệu này đều dựa vào và đều được điều tiết bởi các hành xử (tức là các phương thức) đã được định nghĩa. Các điều kiện hay yêu cầu này có thể được khai báo rõ ràng hay được giả thiết công nhận ngầm bởi người lập trình. Các ngôn ngữ định hướng đối tượng cung cấp nhiều cơ chế cho việc khẳng định rằng các giả thiết đó có tính địa phương cho một phần của chương trình. Các cơ chế này này có thể đọc thấy trong các tài liệu về các chương trình định hướng đối tượng.
OOP tự nó đã đang được dùng để khuyến mại cho nhiều sản phẩm và dịch vụ. Các định nghĩa hiện tại và ích lợi của các đặc tính của OOP thường được màu mè hóa bởi các mục đích của thị trường thương mại. Tương tự, nhiều ngôn ngữ lập trình có những quan điểm đặc biệt về OOP mà nó ít tổng quát trong một số khía cạnh.
Các định nghĩa chính xác của OOP sẽ có sự khác biệt tùy theo quan điểm. Đặc biệt, các ngôn ngữ có kiểu tĩnh thường có cái nhìn hơi khác với các ngôn ngữ có kiểu động về OOP, nguyên do là vì chúng tập trung trên thời gian dịch hay tập trung vào thời gian thi hành của các chương trình.
OOP thường được xem là một mẫu hình hơn là một kiểu hay một phong cách lập trình nhằm nhấn mạnh vào điểm quan trọng là OOP có thể thay đổi phương thức phát triển phần mềm bằng cách thay đổi tư duy của những người lập trình và những kỹ sư phần mềm về phần mềm.
Mẫu hình của OOP chủ yếu không phải là kiểu lập trình mà là kiểu thiết kế. Một hệ thống được thiết kế bởi định nghĩa của các đối tượng mà các đối tượng này sẽ tồn tại trong hệ thống đó, trong mã mà hiện làm việc chưa tương thích với đối tượng, hay là trong người dùng đối tượng do ảnh hưởng của tính chất đóng của đối tượng.
Cũng nên lưu ý rằng có sự khác biệt giữa mẫu hình định hướng đối tượng và lý thuyết các hệ thống. OOP tập trung trên các đối tượng như là các đơn vị của một hệ thống, trong khi đó, lý thuyết các hệ thống lại tự nó chỉ tập trung vào hệ thống. Như là phần trung gian, người ta có thể tìm thấy các dạng thức thiết kế phần mềm hay các kỹ thuật khác dùng các lớp và các đối tượng như là các viên gạch trong những thành phần lớn hơn. Những thành phần này có thể được xem như là bước trung gian từ mẫu hình định hướng đối tượng đến các mô hình "định hướng sống thực" hơn của lý thuyết các hệ thống.
Các mẫu hình định hướng đối tượng con[sửa | sửa mã nguồn]
Có nhiều phong cách lập trình hướng đối tượng. Sự khác nhau giữa các phong cách này là tùy theo việc các ngôn ngữ lập trình chú trọng vào khía cạnh nào của sự thuận lợi của định hướng đối tượng và vào việc kết hợp các cấu trúc trong các phương cách khác nhau.
OOP với các ngôn ngữ cấu trúc[sửa | sửa mã nguồn]
Trong các ngôn ngữ cấu trúc, OOP thường xuất hiện như là một dạng mà ở đó các kiểu dữ liệu được mở rộng để hành xử giống như là một kiểu của một đối tượng trong OOP, hoàn toàn tương tự cho một kiểu dữ liệu trừu tượng với sự mở rộng như là sự kế thừa. Mỗi phương pháp thực ra là một chương trình con mà, một cách cú pháp, giới hạn nội trong một lớp.
Các mô hình nguyên mẫu cơ bản[sửa | sửa mã nguồn]
Khác với cách sử dụng lớp, nguyên mẫu là một mô hình khác ít được biết đến hơn, nó có ý nghĩa đạt tới việc chia sẻ ứng xử theo định hướng đối tượng. Sau khi đối tượng được định nghĩa, một đối tượng khác tương tự sẽ được định nghĩa từ đối tượng ban đầu. Ngôn ngữ nguyên mẫu cơ bản được biết đến nhiều nhất là JavaScript mà đây là một sự thiết lập của ECMAScript. Self, một ngôn ngữ lập trình được phát triển bởi Sun Microsystems cũng là một ví dụ của ngôn ngữ dùng nguyên mẫu cho việc chia sẻ ứng xử chứ không dùng sự phân lớp. NewtonScript, Act1, Io và Delegation là các ví dụ khác. Đặc biệt, Hybrid và Exemplars sử dụng cả hai mô hình nguyên mẫu và phân lớp. Trong các hệ thống nguyên mẫu, các đối tượng tự chúng là các khuôn thức (template), trong khi các hệ thống phân lớp dùng các lớp như là các khuôn thức cho các đối tượng.
Các tiếp cận kiểu phân lớp thì chiếm đa số trong OOP mà nhiều người sẽ định nghĩa các đối tượng như là có tính chất đóng mà việc chia sẻ dữ liệu xảy ra bởi sự phân lớp và bởi tính kế thừa. Mặc dù vậy, khái niệm tổng quát hơn "chia sẻ ứng xử" được công nhận như là các kỹ thuật thay thế (như trường hợp nguyên mẫu).
(Xem thêm Lập trình nguyên mẫu cơ bản)
Mô hình đối tượng cơ bản[sửa | sửa mã nguồn]
Lập trình hướng đối tượng cơ bản là trung tâm về việc tạo thành của các đối tượng và các tương tác của chúng, nhưng có thể sẽ thiếu đi một số chức năng quan trọng của mẫu hình định hướng đối tượng lớp cơ bản như là tính kế thừa. Những hệ thống đối tượng cơ bản như vậy thường không được xem như là định hướng đối tượng vì
- đổi tính kế thừa
một cách điển hình là một yếu tố cốt lõi của OOP.
- Ví dụ của trường hợp này là ngôn ngữ Visual Basic với các phiên bản 6.0 hay nhỏ hơn.
Định nghĩa chuẩn[sửa | sửa mã nguồn]
Đã có nhiều nỗ lực để chuẩn hóa các khái niệm được dùng trong lập trình định hướng đối tượng. Những khái niệm và các kết cấu sau đây đã được suy diễn như là các khái niệm của OOP:
- Các kiểu dữ liệu đồng đại số
- Các lượng tồn tại và các mô đun
- Đệ quy
- Các bản và việc mở rộng bản
- Đa hình biên F
Các nỗ lực tìm một định nghĩa thống nhất hay lý thuyết đứng sau các đối tượng đã không mấy thành công và thường bị phân hóa nặng. Ví dụ, một số định nghĩa thì tập trung lên các hoạt động tinh thần trong khi số khác lại ngả về việc cấu trúc chương trình. Một trong các định nghĩa đơn giản hơn cho rằng OOP là một hành xử của việc sử dụng các biểu đồ cấu trúc dữ liệu hay sử dụng các dãy mà có thể chứa các hàm và các con trỏ sang các biểu đồ khác. Sự kế thừa có thể tiến hành bởi nhân bản các biểu đồ này (mà đôi khi gọi là "nguyên bản hóa"),
OOP trong văn lệnh[sửa | sửa mã nguồn]
Trong những năm gần đây, lập trình đối tượng cơ bản đã đặc biệt trở nên phổ biến trong các ngôn ngữ lập trình văn lệnh vì chúng có tính trừu tượng, tính đóng, khả năng tái sử dụng, và dễ sử dụng (trong khi khả năng kế thừa trong các ngôn ngữ này vẫn còn là các câu hỏi chưa có câu trả lời). Smalltalk có thể là ngôn ngữ đầu tiên có kiểu như trên, Python và Ruby là các ngôn ngữ tương đối mới và được xây dựng từ đầu với ý tưởng OOP, trong khi đó ngôn ngữ văn lệnh Perl đã đang được từ từ thêm vào các chức năng mới về định hướng đối tượng kể từ phiên bản 5. Khả năng của các đối tượng để thể hiện "thế giới thực" là một lý do cho sự phổ biến của JavaScript và ECMAScript, mà được bàn cãi là thích hợp để đại diện cho DOM của các hồ sơ HTML và XML trên Internet.
Ví dụ mã nguồn trong C++[sửa | sửa mã nguồn]
- Ví dụ trên được viết trong C++ có thể dùng bất kì trình dịch nào để dịch thẳng ra tập tin thực thi. Cụ thể là dùng Borland C++ cho Windows hay dùng g++ cho Linux.
- Các dòng màu đen là mã nguồn, các dòng màu khác là các dòng giải thích ý nghĩa sử dụng của OOP.
- Đòi hỏi người đọc biết ít nhiều cách dùng về ngôn ngữ lập trình và trình dịch.
- Bản thân các lớp khi khai báo vẫn có tính trừu tượng. Nghĩa là, nó không sử dụng trực tiếp được (mà chỉ có thể xem là các kiểu dữ liệu). Chỉ khi nào người dùng thực hiện động tác thực thể hóa (instantiate) thì lớp này mới khởi động và tạo thành một đối tượng thực. Trong ví dụ này thì câu lệnh
Inherit1 boy;và câu lệnh
Inherit2 girl;là hai câu lệnh để thực thể hóa thành hai đối tượng
boyvà
girl.
- Sự hỗ trợ các loại đặc tính cho OOP trong C++ rất phong phú. Ví dụ chỉ nhằm minh họa các tính chất cơ bản của OOP.
Một số khái niệm cần biết trong ngôn ngữ OOP hiện đại[sửa | sửa mã nguồn]
Hiện nay các ngôn ngữ OOP phổ biến nhất đều tập trung theo phương pháp phân lớp trong đó có C++, Java, C# và Visual Basic.NET. Ngôn ngữ OOP hay còn gọi là ngôn ngữ lập trình hướng đối tượng, là một phương pháp thiết kế và phát triển phần mềm dựa trên kiến trúc lớp và đối tượng. Sau đây là một số khái niệm mà các ngôn ngữ này thường dùng tới
Lớp (class)[sửa | sửa mã nguồn]
Một lớp có thể được hiểu là khuôn mẫu để tạo ra các đối tượng. Trong một lớp, người ta thường dùng các biến để mô tả các thuộc tính và các hàm để mô tả các phương thức của đối tượng. Khi đã định nghĩa được lớp, ta có thể tạo ra các đối tượng từ lớp này. Để việc sử dụng được dễ dàng, thông qua hệ thống hàm tạo (constructor), người ta dùng lớp như một kiểu dữ liệu để tạo ra các đối tượng.
Lớp con (subclass)[sửa | sửa mã nguồn]
Lớp con là một lớp thông thường nhưng có thêm tính chất kế thừa một phần hay toàn bộ các đặc tính của một lớp khác. Lớp chia sẻ sự kế thừa gọi là lớp cha (parent class). ll
Lớp trừu tượng hay lớp cơ sở trừu tượng (abstract class)[sửa | sửa mã nguồn]
Lớp trừu tượng là một lớp mà nó không thể thực thể hóa thành một đối tượng thực dụng được. Lớp này được thiết kế nhằm tạo ra một lớp có các đặc tính tổng quát nhưng bản thân lớp đó chưa có ý nghĩa (hay không đủ ý nghĩa) để có thể tiến hành viết mã cho việc thực thể hóa. (xem Ví dụ)
-
- Ví dụ: Lớp "hinh" được định nghĩa không có dữ liệu nội tại và chỉ có các phương thức (hàm nội tại) "tinh_chu_vi", "tinh_dien_tich". Nhưng vì lớp hình này chưa xác định được đầy đủ các đặc tính của nó (cụ thể các biến nội tại là tọa độ các đỉnh nếu là đa giác, là đường bán kính và toạ độ tâm nếu là hình tròn,...) nên nó chỉ có thể được viết thành một lớp trừu tượng. Sau đó, người lập trình có thể tạo ra các lớp con chẳng hạn như là lớp "tam_giac", lớp "hinh_tron", lớp "tu_giac",.... Và trong các lớp con này người viết mã sẽ cung cấp các dữ liệu nội tại (như là biến nội tại r làm bán kính và hằng số nội tại Pi cho lớp "hinh_tron" và sau đó viết mã cụ thể cho các phương thức "tinh_chu_vi" và "tinh_dien_tich").
Phương thức (method)[sửa | sửa mã nguồn]
Phương thức của một lớp thường được dùng để mô tả các hành vi của đối tượng (hoặc của lớp). Ví dụ như đối tượng thuộc lớp điện thoại có các hành vi sau: Đổ chuông, chuyển tín hiệu từ sóng sang dạng nghe được, chuyển tín hiệu giọng nói sang dạng chuẩn, chuyển tín hiệu lên tổng đài.v.v. Khi thiết kế, người ta có thể dùng các phương thức để mô tả và thực hiện các hành vi của đối tượng. Mỗi phương thức thường được định nghĩa là một hàm, các thao tác để thực hiện hành vi đó được viết tại nội dung của hàm. Khi thực hiện hành vi này, đối tượng có thể phải thực hiện các hành vi khác. Ví dụ như điện thoại phải chuyển tín hiệu giọng nói sang dạng chuẩn trước khi chuyển lên tổng đài. Cho nên một phương thức trong một lớp có thể sử dụng phương thức khác trong quá trình thực hiện hành vi của mình.
Người ta còn định nghĩa thêm vài loại phương thức đặc biệt:
- Hàm tạo (constructor) là hàm được dùng để tạo ra một đối tượng, cài đặt các giá trị ban đầu cho các thuộc tính của đối tượng đó.
- Hàm hủy (destructor) là hàm dùng vào việc làm sạch bộ nhớ đã dùng để lưu đối tượng và hủy bỏ tên của một đối tượng sau khi đã dùng xong, trong đó có thể bao gồm cả việc xóa các con trỏ nội tại và trả về các phần bộ nhớ mà đối tượng đã dùng.
Nhiều lớp thư viện có sẵn hàm tạo mặc định (thông thường không có tham số) và hàm huỷ.
Thuộc tính (attribute)[sửa | sửa mã nguồn]
Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì chúng sẽ có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng. Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước. Như đã ghi, khi một lớp đã được thực thể hoá thành đối tượng cụ thể thì tập hợp các giá trị của các biến nội tại làm thành trạng thái của đối tượng. Giống như trường hợp của phương thức, tùy theo người viết mã, biến nội tại có thể chỉ được dùng bên trong các phương thức của chính lớp đó, có thể cho phép các câu lệnh bên ngoài lớp, hay chỉ cho phép các lớp có quan hệ đặc biệt như là quan hệ lớp con, (và quan hệ bạn bè (friend) trong C++) được phép dùng tới nó (hay thay đổi giá trị của nó). Mỗi thuộc tính của một lớp còn được gọi là thành viên dữ liệu của lớp đó.
Quan hệ giữa lớp và đối tượng[sửa | sửa mã nguồn]
Lớp trong quan niệm thông thường là cách phân loại các thực thể dựa trên những đặc điểm chung của các thực thể đó. Do đó lớp là khái niệm mang tính trừu tượng hóa rất cao. Ví dụ như lớp "người" dùng để chỉ những thực thể sống trên Trái Đất có những thuộc tính: có hai chân, hai bàn tay khéo léo, có tư duy, ngôn ngữ v.v và có phương thức: giao tiếp bằng ngôn ngữ, tư duy, đi, đứng bằng hai chân... Khi đó hai người cụ thể ông A, ông B là các đối tượng thuộc lớp người. Trong ngôn ngữ lập trình, ta cũng hiểu khái niệm lớp tương tự, cho nên ta có quá trình "Thực thể hóa" sau, tạo một đối tượng thuộc một lớp đã được ta định nghĩa (phân loại).
Thực thể (instance)[sửa | sửa mã nguồn]
Thực thể hóa (instantiate) là quá trình khai báo để có một tên (có thể được xem như là một biến) trở thành một đối tượng từ một lớp nào đó.
Một lớp sau khi được tiến hành thực thể hóa để có một đối tượng cụ thể gọi là một thực thể. Hay nói ngược lại một thực thể là một đối tượng riêng lẻ của một lớp đã định trước. Như các biến thông thường, hai thực thể của cùng một lớp có thể có trạng thái nội tại khác nhau (xác định bởi các giá trị hiện có của các biến nội tại) và do đó hoàn toàn độc lập nhau nếu không có yêu cầu gì đặc biệt từ người lập trình. " Thực thể hóa: gần giống như cá nhân hóa. Một lớp khi được " cá nhân hóa" sẽ thành một đối tượng cụ thể.
Công cộng (public)[sửa | sửa mã nguồn]
Công cộng là một tính chất được dùng để gán cho các phương thức, các biến nội tại, hay các lớp mà khi khai báo thì người lập trình đã cho phép các câu lệnh bên ngoài cũng như các đối tượng khác được phép dùng đến nó.
- Ví dụ: Trong C++ khai báo
public: int my_var;thì biến my_var có hai tính chất là tính công cộng và là một integer cả hai tính chất này hợp thành đặc tính của biến my_var khiến nó có thể được sử dụng hay thay đổi giá trị của nó (bởi các câu lệnh) ở mọi nơi bên ngoài lẫn bên trong của lớp.
Riêng tư (private)[sửa | sửa mã nguồn]
Riêng tư là sự thể hiện tính chất đóng mạnh nhất (của một đặc tính hay một lớp). Khi dùng tính chất này gán cho một biến, một phương thức thì biến hay phương thức đó chỉ có thể được sử dụng bên trong của lớp mà chúng được định nghĩa. Mọi nỗ lực dùng trực tiếp đến chúng từ bên ngoài qua các câu lệnh hay từ các lớp con sẽ bị phủ nhận hay bị lỗi.
Bảo tồn (protected)[sửa | sửa mã nguồn]
Tùy theo ngôn ngữ, sẽ có vài điểm nhỏ khác nhau về cách hiểu tính chất này. Nhìn chung đây là tính chất mà khi dùng để áp dụng cho các phương thức, các biến nội tại, hay các lớp thì chỉ có trong nội bộ của lớp đó hay các lớp con của nó (hay trong nội bộ một gói như trong Java) được phép gọi đến hay dùng đến các phương pháp, biến hay lớp đó.
So với tính chất riêng tư thì tính bảo tồn rộng rãi hơn về nghĩa chia sẻ dữ liệu hay chức năng. Nó cho phép một số trường hợp được dùng tới các đặc tính của một lớp (từ một lớp con chẳng hạn).
Lưu ý: Các tính chất công cộng, riêng tư và bảo tồn đôi khi còn được dùng để chỉ thị cho một lớp con cách thức kế thừa một lớp cha như trong C++.
Đa kế thừa (multiple inheritance)[sửa | sửa mã nguồn]
Đây là một tính chất cho phép một lớp con có khả năng kế thừa trực tiếp cùng lúc nhiều lớp khác.
Vài điểm cần lưu ý khi viết mã dùng tính chất đa kế thừa:
- Khi muốn có một sự kế thừa từ nhiều lớp cha thì các lớp này cần phải độc lập và đặc biệt tên của các dữ liệu hay hàm cho phép kế thừa phải có tên khác nhau để tránh lỗi
"ambiguity". Bởi vì lúc đó trình dịch sẽ không thể xác định được là lớp con sẽ thừa kế tên nào của các lớp cha.
- Nhiều ngôn ngữ, ví dụ như Java, không có đa thừa kế, nhưng chúng có khái niệm giao diện Interface. Với Interface, ta có thể có hầu hết các lợi ích mà đa thừa kế mang lại.
Ngoài các khái niệm trên, tùy theo ngôn ngữ, có thể sẽ có các chức năng OOP riêng biệt được cấp thêm vào.
Lịch sử[sửa | sửa mã nguồn]
Khái niệm về các đối tượng và thực thể trong khoa học máy tính được nhiều người biết đến từ hệ thống PDP-1 của MIT. Đây có lẽ là Ví dụ sớm nhất của kiến trúc cơ sở có khả năng thực. Một bằng chứng sớm khác của OOP được tìm thấy qua Sketchpad viết bởi Ivan Sutherland trong năm 1963, tuy nhiên, đây chỉ là một ứng dụng chứ không là một mẫu hình lập trình.
Ngôn ngữ lập trình hướng đối tượng đầu tiên là Simula, ngôn ngữ này được thiết kế để dùng trong các việc mô phỏng, được sáng tạo bởi Ole-Johan Dahl và Kristen Nygaard thuộc Trung tâm Máy tính Na Uy ở Oslo. Các kiến thức trong ngôn ngữ này sau đó đã được dùng trong nhiều ngôn ngữ khác, bắt đầu từ Lisp và Pascal cho đến họ ngôn ngữ Smalltalk.
Lập trình hướng đối tượng đã được phát triển như là phương pháp lập trình chủ đạo từ giữa thập niên 1980 nguyên do đáng kể là việc ảnh hưởng của C++, một ngôn ngữ mở rộng của C. Địa vị thống trị của OOP đã được củng cố vững chắc bởi sự phổ biến của các GUI dành cho ngôn ngữ lập trình hướng đối tượng ngày càng tiện lợi. Một Ví dụ về quan hệ gần gũi của thư viện GUI động và ngôn ngữ OOP là phần mềm Cocoa, nó là khung cơ sở của Mac OS X dược viết bằng Objective C (Objective C là một loại ngôn ngữ hướng đối tượng mở rộng của C với việc thông báo động). Công cụ cho OOP cũng được nâng cao phần "lập trình điều khiển theo sự kiện" (mặc dù khái niệm này không chỉ dành cho OOP).
Tại Zürich, Niklaus Wirth và những cộng sự đã theo dõi các đề tài như là dữ liệu trừu tượng và lập trình mô đun. Modula-2 bao gồm cả hai đặc tính đó. Thiết kế liền tiếp theo là Oberon bao gồm sự tiếp cận riêng biệt với việc định hướng đối tượng, các lớp,... Sự tiếp cận này không như Smalltalk, và cũng khác hẳn C++.
Các chức năng của hướng đối tượng cũng đã đang được thêm vào nhiều ngôn ngữ trong suốt thời gian đó kể cả Ada, BASIC, Lisp, Fortran, Pascal và nhiều nữa. Việc cộng thêm các chức năng đó cho các ngôn ngữ mà được trước đó không chủ định thiết kế cho chúng ngay từ đầu cũng thường dẫn tới nhiều khó khăn trong khả năng tương thích (với mã nguồn viết cho các phiên bản cũ) và khả năng bảo trì mã. Điển hình của trường hợp này là Pascal và Visual Basic. Các ngôn ngữ thuần túy hướng đối tượng, ở phía khác, lại thiếu các đặc tính mà nhiều người lập trình phụ thuộc vào. Để bắc cầu cho khoảng trống này, nhiều nỗ lực đã được xúc tiến để tạo ra các ngôn ngữ đặt cơ sở trên các phương pháp hướng đối tượng nhưng lại cho phép dùng nhiều đặc tính lập trình cấu trúc theo những phương cách "an toàn". Ngôn ngữ Eiffel của Bertrand Meyer đã sớm thành công với các mục tiêu này.
Trong thập niên đã qua, Java được dùng rộng rãi một phần là do sự tương tự với C và C++, nhưng có lẽ do phần khác quan trọng hơn là việc lắp đặt sử dụng máy ảo mà chủ ý là thực thi cùng một mã nguồn cho nhiều nền tảng khác nhau. .NET của Microsoft cũng mở đầu với các chủ ý tương tự và cộng thêm việc hỗ trợ nhiều ngôn ngữ hay các sự biến thể của các ngôn ngữ cũ (như trường hợp C# và Visual Basic).
Gần đây, một số ngôn ngữ xuất hiện với chức năng chính là định hướng đối tượng nhưng lại tương thích được với phương pháp thủ tục như là Python và Ruby. Bên cạnh Java, C# và Visual Basic.NET là hai ngôn ngữ OOP quan trọng hiện tại thiết kế bởi Microsoft.
Giống như lập trình thủ tục đã dẫn tới việc tinh lọc các kỹ thuật như là lập trình cấu trúc, phần mềm hướng đối tượng hiện đại thiết kế các phương pháp bao gồm các sự tinh lọc. Chẳng hạn như là việc ứng dụng các dạng thức thiết kế, thiết kế bởi hợp đồng và các ngôn ngữ mô hình trong đó có UML.
Các ngôn ngữ[sửa | sửa mã nguồn]
Bài chính: Ngôn ngữ lập trình hướng đối tượng
- C#
- C++
- Common Lisp Object System
- Eiffel
- Fortran 2003
- Java
- Objective-C
- OCaml
- Object Pascal
- Pascal
- Perl
- PHP
- Python
- Ruby
- Simula
- Sleep
- Smalltalk
- Ada
- Visual FoxPro
- Actionscript
- Visual Basic
Đọc thêm[sửa | sửa mã nguồn]
- Grady Booch: Object-Oriented Analysis and Design with Applications, Addison-Wesley, ISBN 0-8053-5340-2
- Alan Kay: The Early History of Smalltalk
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object Oriented Software, Addison-Wesley, ISBN 0-201-63361-2
- Bertrand Meyer: Object-Oriented Software Construction, Prentice Hall, ISBN 0-13-629155-4
- James Rumbaugh, Michael Blaha, William Premerlani, Frederick Eddy, William Lorensen: Object-Oriented Modeling and Design, Prentice Hall, ISBN 0-13-629841-9
- Ivar Jacobson: Object-Oriented Software Engineering: A Use Case-Driven Approach, Addison-Wesley, ISBN 0-201-54435-0
- Harold Abelson, Gerald Jay Sussman, Julie Sussman: Structure and Interpretation of Computer Programs, The MIT Press, ISBN 0-262-01153-0
- Martin Abadi, Luca Cardelli: A Theory of Objects, Springer-Verlag, ISBN 0-387-94775-2
- Paul Harmon, William Morrissey: The Object Technology Casebook - Lessons from Award-Winning Business Applications, John Wiley & Sons, ISBN 0-471-14717-6
- David A. Taylor: Object-Oriented Information Systems - Planning and Implementation, John Wiley & Sons, ISBN 0-471-54364-0
- Peter Eeles, Oliver Sims: Building Business Objects, John Wiley & Sons, ISBN 0-471-19176-0
Các bài liên hệ[sửa | sửa mã nguồn]
- en:Object-oriented programming language
- en:Aspect-oriented programming
- en:Programming paradigm
- en:Software componentry
- en:Interface description language
- en:Distributed programming
- en:List of object-oriented programming terms
- en:Design pattern (computer science)
- en:Refactoring
- en:CORBA
- en:Globus
- en:DCOM
- en:Glossary of object-oriented programming
Tham khảo[sửa | sửa mã nguồn]
- Introduction to OOP
- Introduction to Object Oriented Programming
- Structured Programming vs Object-Oriented Programming
- Object-oriented programming FAQ
- Example of the subtyping problem
- What are OOP's Jargons and Complexities
- Object Oriented Design Principles
- The report "Object Orientation Redefined" outlines how OO has been considered a thinking tool, i.e. "we view the world in objects", and how such an approach may further our understanding of object-oriented formalisation.

markdown:
# Lập trình hướng đối tượng
|Bài viết này
|cần thêm . **Lập trình hướng đối tượng** (gọi tắt là **OOP**, từ chữ [Anh ngữ](/wiki/Ti%E1%BA%BFng_Anh) *object-oriented programming*), hay còn gọi là **lập trình định hướng đối tượng**, là kĩ thuật lập trình hỗ trợ công nghệ đối tượng. OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép [lập trình viên](/wiki/L%E1%BA%ADp_tr%C3%ACnh_vi%C3%AAn) tập trung vào các đối tượng phần mềm ở bậc cao hơn. Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về [lập trình](/wiki/L%E1%BA%ADp_tr%C3%ACnh_m%C3%A1y_t%C3%ADnh) hơn là các phương pháp trước đó.
Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các
[ứng dụng](/wiki/Ph%E1%BA%A7n_m%E1%BB%81m_%E1%BB%A9ng_d%E1%BB%A5ng) mà các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là tương tác với các đối tượng vật lý.
Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường.
## Mục lục
[1 Các tính chất cơ bản](#C.C3.A1c_t.C3.ADnh_ch.E1.BA.A5t_c.C6.A1_b.E1.BA.A3n) [2 Một điểm mới về mẫu hình, về quan điểm](#M.E1.BB.99t_.C4.91i.E1.BB.83m_m.E1.BB.9Bi_v.E1.BB.81_m.E1.BA.ABu_h.C3.ACnh.2C_v.E1.BB.81_quan_.C4.91i.E1.BB.83m) [3 Các mẫu hình định hướng đối tượng con](#C.C3.A1c_m.E1.BA.ABu_h.C3.ACnh_.C4.91.E1.BB.8Bnh_h.C6.B0.E1.BB.9Bng_.C4.91.E1.BB.91i_t.C6.B0.E1.BB.A3ng_con) [4 Định nghĩa chuẩn](#.C4.90.E1.BB.8Bnh_ngh.C4.A9a_chu.E1.BA.A9n) [5 OOP trong văn lệnh](#OOP_trong_v.C4.83n_l.E1.BB.87nh) [6 Ví dụ mã nguồn trong C++](#V.C3.AD_d.E1.BB.A5_m.C3.A3_ngu.E1.BB.93n_trong_C.2B.2B) [7 Một số khái niệm cần biết trong ngôn ngữ OOP hiện đại](#M.E1.BB.99t_s.E1.BB.91_kh.C3.A1i_ni.E1.BB.87m_c.E1.BA.A7n_bi.E1.BA.BFt_trong_ng.C3.B4n_ng.E1.BB.AF_OOP_hi.E1.BB.87n_.C4.91.E1.BA.A1i) [8 Bảo tồn (](#B.E1.BA.A3o_t.E1.BB.93n_.28protected.29) *protected*) [9 Lịch sử](#L.E1.BB.8Bch_s.E1.BB.AD) [10 Các ngôn ngữ](#C.C3.A1c_ng.C3.B4n_ng.E1.BB.AF) [11 Đọc thêm](#.C4.90.E1.BB.8Dc_th.C3.AAm) [12 Các bài liên hệ](#C.C3.A1c_b.C3.A0i_li.C3.AAn_h.E1.BB.87) [13 Tham khảo](#Tham_kh.E1.BA.A3o)
## Các tính chất cơ bản[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=1)] **Đố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**( *attribute / Properties*). 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)( *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ó 4 tính chất chính sau:
-
**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 *lớp cơ sở trừu tượng*.
-
**Tính đóng gói**( *encapsulation*) và **che giấ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.
-
**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.
-
- Ví 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".
-
**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.
## Một điểm mới về mẫu hình, về quan điểm[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=2)]
OOP vẫn còn là một đề tài của nhiều tranh cãi về định nghĩa chuẩn xác hay về các nguyên lý của nó.
Trong dạng tổng quát nhất, OOP được hiểu theo cách là một loại thực nghiệm viết chương trình văn bản được phân cấp ra thành nhiều mô đun (
*module*), mà mỗi mô đun đóng vai như một lớp vỏ che đại diện cho mỗi kiểu dữ liệu.
Những khái niệm liên hệ đã được góp nhặt lại để tạo thành một khuôn khổ cho việc lập trình. Các triết lý đằng sau việc định hướng đối tượng đã trở nên mạnh mẽ để tạo thành một sự chuyển đổi
[mẫu hình](/wiki/M%E1%BA%ABu_h%C3%ACnh) trong ngành lập trình.
Những mẫu hình khác như
[lập trình chức năng](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_ch%E1%BB%A9c_n%C4%83ng&action=edit&redlink=1) và [lập trình thủ tục](/wiki/L%E1%BA%ADp_tr%C3%ACnh_th%E1%BB%A7_t%E1%BB%A5c) tập trung chủ yếu trên các hành động, còn [lập trình lô gíc](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_l%C3%B4_g%C3%ADc&action=edit&redlink=1) lại tập trung vào những khẳng định hợp lý để kích hoạt sự thực thi của mã chương trình.
OOP đã phát triển một cách độc lập từ việc nghiên cứu về các ngôn ngữ định hướng của hệ thống mô phỏng, đó là SIMULA 67, và từ việc nghiên cứu các kiến trúc của hệ thống có độ tin cậy cao, đó là các kiến trúc
[CPU](/wiki/CPU) và khả năng cơ bản của các [hệ điều hành](/wiki/H%E1%BB%87_%C4%91i%E1%BB%81u_h%C3%A0nh).
Một chức năng đặc sắc của OOP là việc xử lý các
[kiểu con](/w/index.php?title=Ki%E1%BB%83u_con&action=edit&redlink=1) của các kiểu dữ liệu.
Dữ liệu của các đối tượng, một cách tổng quát, được đòi hỏi trong thiết kế để thỏa mãn các yêu cầu của người lập trình (tức là các
[lớp](/wiki/L%E1%BB%9Bp_(khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh))).
Các kiểu dữ liệu bị giới hạn thêm các điều kiện mặc dù có cùng kiểu dữ liệu với loại không bị ràng buộc bởi các điều kiện đó, gọi là
**kiểu dữ liệu con**. Cả hai loại kiểu dữ liệu này đều dựa vào và đều được điều tiết bởi các hành xử (tức là các phương thức) đã được định nghĩa. Các điều kiện hay yêu cầu này có thể được khai báo rõ ràng hay được giả thiết công nhận ngầm bởi người lập trình. Các ngôn ngữ định hướng đối tượng cung cấp nhiều cơ chế cho việc khẳng định rằng các giả thiết đó có tính địa phương cho một phần của chương trình. Các cơ chế này này có thể đọc thấy trong các tài liệu về các chương trình định hướng đối tượng.
OOP tự nó đã đang được dùng để khuyến mại cho nhiều sản phẩm và dịch vụ. Các định nghĩa hiện tại và ích lợi của các đặc tính của OOP thường được màu mè hóa bởi các mục đích của thị trường thương mại. Tương tự, nhiều
[ngôn ngữ lập trình](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh) có những quan điểm đặc biệt về OOP mà nó ít tổng quát trong một số khía cạnh.
Các định nghĩa chính xác của OOP sẽ có sự khác biệt tùy theo quan điểm. Đặc biệt, các
[ngôn ngữ có kiểu tĩnh](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh#STATIC) thường có cái nhìn hơi khác với các [ngôn ngữ có kiểu động](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh#DYNAMIC) về OOP, nguyên do là vì chúng tập trung trên thời gian dịch hay tập trung vào thời gian thi hành của các chương trình.
OOP thường được xem là một
[mẫu hình](/wiki/M%E1%BA%ABu_h%C3%ACnh) hơn là một kiểu hay một phong cách lập trình nhằm nhấn mạnh vào điểm quan trọng là OOP có thể thay đổi phương thức phát triển phần mềm bằng cách thay đổi tư duy của những [người lập trình](/wiki/L%E1%BA%ADp_tr%C3%ACnh_vi%C3%AAn) và những [kỹ sư phần mềm](/w/index.php?title=K%E1%BB%B9_s%C6%B0_ph%E1%BA%A7n_m%E1%BB%81m&action=edit&redlink=1) về phần mềm.
Mẫu hình của OOP chủ yếu không phải là kiểu lập trình mà là kiểu thiết kế. Một hệ thống được thiết kế bởi định nghĩa của các đối tượng mà các đối tượng này sẽ tồn tại trong hệ thống đó, trong mã mà hiện làm việc chưa tương thích với đối tượng, hay là trong người dùng đối tượng do ảnh hưởng của tính chất đóng của đối tượng.
Cũng nên lưu ý rằng có sự khác biệt giữa mẫu hình định hướng đối tượng và
[lý thuyết các hệ thống](/w/index.php?title=L%C3%BD_thuy%E1%BA%BFt_c%C3%A1c_h%E1%BB%87_th%E1%BB%91ng&action=edit&redlink=1). OOP tập trung trên các đối tượng như là các đơn vị của một hệ thống, trong khi đó, lý thuyết các hệ thống lại tự nó chỉ tập trung vào hệ thống. Như là phần trung gian, người ta có thể tìm thấy các [dạng thức thiết kế](/wiki/D%E1%BA%A1ng_th%E1%BB%A9c_thi%E1%BA%BFt_k%E1%BA%BF) phần mềm hay các kỹ thuật khác dùng các lớp và các đối tượng như là các viên gạch trong những thành phần lớn hơn. Những thành phần này có thể được xem như là bước trung gian từ mẫu hình định hướng đối tượng đến các mô hình "định hướng sống thực" hơn của lý thuyết các hệ thống.
## Các mẫu hình định hướng đối tượng con[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=3)]
Có nhiều phong cách lập trình hướng đối tượng. Sự khác nhau giữa các phong cách này là tùy theo việc các
[ngôn ngữ lập trình](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh) chú trọng vào khía cạnh nào của sự thuận lợi của định hướng đối tượng và vào việc kết hợp các cấu trúc trong các phương cách khác nhau.
### OOP với các ngôn ngữ cấu trúc[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=4) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=4)]
Trong các ngôn ngữ cấu trúc, OOP thường xuất hiện như là một dạng mà ở đó các kiểu dữ liệu được mở rộng để hành xử giống như là một kiểu của một đối tượng trong OOP, hoàn toàn tương tự cho một
[kiểu dữ liệu trừu tượng](/w/index.php?title=Ki%E1%BB%83u_d%E1%BB%AF_li%E1%BB%87u_tr%E1%BB%ABu_t%C6%B0%E1%BB%A3ng&action=edit&redlink=1) với sự mở rộng như là sự kế thừa. Mỗi phương pháp thực ra là một chương trình con mà, một cách cú pháp, giới hạn nội trong một lớp.
### Các mô hình nguyên mẫu cơ bản[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=5) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=5)]
Khác với cách sử dụng lớp,
**nguyên mẫu** là một mô hình khác ít được biết đến hơn, nó có ý nghĩa đạt tới việc chia sẻ ứng xử theo định hướng đối tượng. Sau khi đối tượng được định nghĩa, một đối tượng khác tương tự sẽ được định nghĩa từ đối tượng ban đầu. Ngôn ngữ nguyên mẫu cơ bản được biết đến nhiều nhất là [JavaScript](/wiki/JavaScript) mà đây là một sự thiết lập của [ECMAScript](/w/index.php?title=ECMAScript&action=edit&redlink=1). [Self](/w/index.php?title=Self&action=edit&redlink=1), một ngôn ngữ lập trình được phát triển bởi [Sun Microsystems](/wiki/Sun_Microsystems) cũng là một ví dụ của ngôn ngữ dùng nguyên mẫu cho việc chia sẻ ứng xử chứ không dùng sự phân lớp. [NewtonScript](/w/index.php?title=NewtonScript&action=edit&redlink=1), [Act1](/w/index.php?title=Act1&action=edit&redlink=1), [Io](/w/index.php?title=Io_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1) và [Delegation](/w/index.php?title=Delegation&action=edit&redlink=1) là các ví dụ khác. Đặc biệt, [Hybrid](/w/index.php?title=Hybrid&action=edit&redlink=1) và [Exemplars](/w/index.php?title=Exemplars&action=edit&redlink=1) sử dụng cả hai mô hình nguyên mẫu và phân lớp. Trong các hệ thống nguyên mẫu, các đối tượng tự chúng là các khuôn thức ( *template*), trong khi các hệ thống phân lớp dùng các lớp như là các khuôn thức cho các đối tượng.
Các tiếp cận kiểu phân lớp thì chiếm đa số trong OOP mà nhiều người sẽ định nghĩa các đối tượng như là có tính chất đóng mà việc chia sẻ dữ liệu xảy ra bởi sự phân lớp và bởi tính kế thừa. Mặc dù vậy, khái niệm tổng quát hơn "chia sẻ ứng xử" được công nhận như là các kỹ thuật thay thế (như trường hợp nguyên mẫu).
(Xem thêm
[Lập trình nguyên mẫu cơ bản](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_nguy%C3%AAn_m%E1%BA%ABu_c%C6%A1_b%E1%BA%A3n&action=edit&redlink=1))
### Mô hình đối tượng cơ bản[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=6) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=6)]
Lập trình hướng đối tượng cơ bản là trung tâm về việc tạo thành của các đối tượng và các tương tác của chúng, nhưng có thể sẽ thiếu đi một số chức năng quan trọng của mẫu hình định hướng đối tượng lớp cơ bản như là tính kế thừa. Những hệ thống đối tượng cơ bản như vậy thường không được xem như là định hướng đối tượng vì
- đổi
[tính kế thừa](/w/index.php?title=T%C3%ADnh_k%E1%BA%BF_th%E1%BB%ABa&action=edit&redlink=1)
một cách điển hình là một yếu tố cốt lõi của OOP.
- Ví dụ của trường hợp này là ngôn ngữ
[Visual Basic](/wiki/Visual_Basic)với các phiên bản 6.0 hay nhỏ hơn.
## Định nghĩa chuẩn[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=7) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=7)]
Đã có nhiều nỗ lực để chuẩn hóa các khái niệm được dùng trong lập trình định hướng đối tượng. Những khái niệm và các kết cấu sau đây đã được suy diễn như là các khái niệm của OOP:
- Các
[kiểu dữ liệu đồng đại số](/w/index.php?title=Ki%E1%BB%83u_d%E1%BB%AF_li%E1%BB%87u_%C4%91%E1%BB%93ng_%C4%91%E1%BA%A1i_s%E1%BB%91&action=edit&redlink=1)
- Các
[lượng tồn tại](/w/index.php?title=L%C6%B0%E1%BB%A3ng_t%E1%BB%93n_t%E1%BA%A1i&action=edit&redlink=1)và các [mô đun](/w/index.php?title=M%C3%B4_%C4%91un&action=edit&redlink=1) [Đệ quy](/wiki/%C4%90%E1%BB%87_quy)
- Các
[bản](/wiki/B%E1%BA%A3n)và việc [mở rộng bản](/w/index.php?title=M%E1%BB%9F_r%E1%BB%99ng_b%E1%BA%A3n&action=edit&redlink=1) [Đa hình biên F](/w/index.php?title=%C4%90a_h%C3%ACnh_bi%C3%AAn_F&action=edit&redlink=1)
Các nỗ lực tìm một định nghĩa thống nhất hay lý thuyết đứng sau các đối tượng đã không mấy thành công và thường bị phân hóa nặng. Ví dụ, một số định nghĩa thì tập trung lên các hoạt động tinh thần trong khi số khác lại ngả về việc cấu trúc chương trình. Một trong các định nghĩa đơn giản hơn cho rằng OOP là một hành xử của việc sử dụng các biểu đồ cấu trúc dữ liệu hay sử dụng các dãy mà có thể chứa các hàm và các con trỏ sang các biểu đồ khác. Sự kế thừa có thể tiến hành bởi nhân bản các biểu đồ này (mà đôi khi gọi là "nguyên bản hóa"),
## OOP trong văn lệnh[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=8) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=8)]
Trong những năm gần đây, lập trình đối tượng cơ bản đã đặc biệt trở nên phổ biến trong các
[ngôn ngữ lập trình văn lệnh](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh_v%C4%83n_l%E1%BB%87nh&action=edit&redlink=1) vì chúng có tính trừu tượng, tính đóng, khả năng tái sử dụng, và dễ sử dụng (trong khi khả năng kế thừa trong các ngôn ngữ này vẫn còn là các câu hỏi chưa có câu trả lời). [Smalltalk](/wiki/Smalltalk) có thể là ngôn ngữ đầu tiên có kiểu như trên, [Python](/wiki/Python_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) và [Ruby](/wiki/Ruby_(%C4%91%E1%BB%8Bnh_h%C6%B0%E1%BB%9Bng)) là các ngôn ngữ tương đối mới và được xây dựng từ đầu với ý tưởng OOP, trong khi đó ngôn ngữ văn lệnh [Perl](/wiki/Perl) đã đang được từ từ thêm vào các chức năng mới về định hướng đối tượng kể từ phiên bản 5. Khả năng của các đối tượng để thể hiện "thế giới thực" là một lý do cho sự phổ biến của JavaScript và ECMAScript, mà được bàn cãi là thích hợp để đại diện cho [DOM](/wiki/DOM) của các hồ sơ [HTML](/wiki/HTML) và [XML](/wiki/XML) trên [Internet](/wiki/Internet).
## Ví dụ mã nguồn trong C++[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=9) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=9)]
- Ví dụ trên được viết trong C++ có thể dùng bất kì trình dịch nào để dịch thẳng ra tập tin thực thi. Cụ thể là dùng
[Borland C++](/w/index.php?title=Borland_C%2B%2B&action=edit&redlink=1)cho Windows hay dùng [g++](/w/index.php?title=G%2B%2B&action=edit&redlink=1)cho [Linux](/wiki/Linux).
- Các dòng màu đen là mã nguồn, các dòng màu khác là các dòng giải thích ý nghĩa sử dụng của OOP.
- Đòi hỏi người đọc biết ít nhiều cách dùng về
[ngôn ngữ lập trình](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)và [trình dịch](/wiki/Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch).
- Bản thân các lớp khi khai báo vẫn có tính trừu tượng. Nghĩa là, nó không sử dụng trực tiếp được (mà chỉ có thể xem là các kiểu dữ liệu). Chỉ khi nào người dùng thực hiện động tác thực thể hóa (
*instantiate*) thì lớp này mới khởi động và tạo thành một đối tượng thực. Trong ví dụ này thì câu lệnh
Inherit1 boy;và câu lệnh
Inherit2 girl;là hai câu lệnh để thực thể hóa thành hai đối tượng
boyvà
girl.
- Sự hỗ trợ các loại đặc tính cho OOP trong C++ rất phong phú. Ví dụ chỉ nhằm minh họa các tính chất cơ bản của OOP.
## Một số khái niệm cần biết trong ngôn ngữ OOP hiện đại[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=10) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=10)]
Hiện nay các ngôn ngữ OOP phổ biến nhất đều tập trung theo phương pháp phân lớp trong đó có C++, Java, C# và Visual Basic.NET. Ngôn ngữ OOP hay còn gọi là ngôn ngữ lập trình hướng đối tượng, là một phương pháp thiết kế và phát triển phần mềm dựa trên kiến trúc lớp và đối tượng. Sau đây là một số khái niệm mà các ngôn ngữ này thường dùng tới
#### Lớp (
*class*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=11) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=11)]
Một lớp có thể được hiểu là khuôn mẫu để tạo ra các đối tượng. Trong một lớp, người ta thường dùng các biến để mô tả các
[thuộc tính](#OBJ) và các hàm để mô tả các [phương thức](/w/index.php?title=Ph%C6%B0%C6%A1ng_th%E1%BB%A9c&action=edit&redlink=1) của đối tượng. Khi đã định nghĩa được lớp, ta có thể tạo ra các đối tượng từ lớp này. Để việc sử dụng được dễ dàng, thông qua hệ thống hàm tạo (constructor), người ta dùng lớp như một kiểu dữ liệu để tạo ra các đối tượng.
#### Lớp con (
*subclass*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=12) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=12)]
Lớp con là một lớp thông thường nhưng có thêm tính chất kế thừa một phần hay toàn bộ các
[đặc tính](#OBJ) của một lớp khác. Lớp chia sẻ sự kế thừa gọi là [lớp cha](/w/index.php?title=L%E1%BB%9Bp_cha&action=edit&redlink=1) ( *parent class*). ll
#### Lớp trừu tượng hay lớp cơ sở trừu tượng (
*abstract class*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=13) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=13)]
Lớp trừu tượng là một lớp mà nó không thể thực thể hóa thành một đối tượng thực dụng được. Lớp này được thiết kế nhằm tạo ra một lớp có các đặc tính tổng quát nhưng bản thân lớp đó chưa có ý nghĩa (hay không đủ ý nghĩa) để có thể tiến hành viết mã cho việc thực thể hóa. (xem
[Ví dụ](#EXAMPLE))
-
- Ví dụ: Lớp "hinh" được định nghĩa không có dữ liệu nội tại và chỉ có các phương thức (hàm nội tại) "tinh_chu_vi", "tinh_dien_tich". Nhưng vì lớp hình này chưa xác định được đầy đủ các đặc tính của nó (cụ thể các biến nội tại là tọa độ các đỉnh nếu là đa giác, là đường bán kính và toạ độ tâm nếu là hình tròn,...) nên nó chỉ có thể được viết thành một lớp trừu tượng. Sau đó, người lập trình có thể tạo ra các lớp con chẳng hạn như là lớp "tam_giac", lớp "hinh_tron", lớp "tu_giac",.... Và trong các lớp con này người viết mã sẽ cung cấp các dữ liệu nội tại (như là biến nội tại r làm bán kính và hằng số nội tại Pi cho lớp "hinh_tron" và sau đó viết mã cụ thể cho các phương thức "tinh_chu_vi" và "tinh_dien_tich").
#### Phương thức (
*method*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=14) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=14)]
Phương thức của một lớp thường được dùng để mô tả các hành vi của đối tượng (hoặc của lớp). Ví dụ như đối tượng thuộc lớp điện thoại có các hành vi sau: Đổ chuông, chuyển tín hiệu từ sóng sang dạng nghe được, chuyển tín hiệu giọng nói sang dạng chuẩn, chuyển tín hiệu lên tổng đài.v.v. Khi thiết kế, người ta có thể dùng các phương thức để mô tả và thực hiện các hành vi của đối tượng. Mỗi phương thức thường được định nghĩa là một
[hàm](/wiki/H%C3%A0m), các thao tác để thực hiện hành vi đó được viết tại nội dung của hàm. Khi thực hiện hành vi này, đối tượng có thể phải thực hiện các hành vi khác. Ví dụ như điện thoại phải chuyển tín hiệu giọng nói sang dạng chuẩn trước khi chuyển lên tổng đài. Cho nên một phương thức trong một lớp có thể sử dụng phương thức khác trong quá trình thực hiện hành vi của mình.
Người ta còn định nghĩa thêm vài loại phương thức đặc biệt:
- Hàm tạo (
*constructor*) là hàm được dùng để tạo ra một đối tượng, cài đặt các giá trị ban đầu cho các thuộc tính của đối tượng đó.
- Hàm hủy (
*destructor*) là hàm dùng vào việc làm sạch bộ nhớ đã dùng để lưu đối tượng và hủy bỏ tên của một đối tượng sau khi đã dùng xong, trong đó có thể bao gồm cả việc xóa các con trỏ nội tại và trả về các phần bộ nhớ mà đối tượng đã dùng.
Nhiều lớp thư viện có sẵn hàm tạo mặc định (thông thường không có tham số) và hàm huỷ.
#### Thuộc tính (
*attribute*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=15) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=15)]
Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì chúng sẽ có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng. Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước. Như đã ghi, khi một lớp đã được thực thể hoá thành đối tượng cụ thể thì tập hợp các giá trị của các biến nội tại làm thành trạng thái của đối tượng. Giống như trường hợp của phương thức, tùy theo người viết mã, biến nội tại có thể chỉ được dùng bên trong các phương thức của chính lớp đó, có thể cho phép các câu lệnh bên ngoài lớp, hay chỉ cho phép các lớp có quan hệ đặc biệt như là quan hệ
[lớp con](/w/index.php?title=L%E1%BB%9Bp_con&action=edit&redlink=1), (và quan hệ bạn bè ( *friend*) trong C++) được phép dùng tới nó (hay thay đổi giá trị của nó). Mỗi thuộc tính của một lớp còn được gọi là **thành viên dữ liệu** của lớp đó.
#### Quan hệ giữa lớp và đối tượng[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=16) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=16)]
Lớp trong quan niệm thông thường là cách phân loại các thực thể dựa trên những đặc điểm chung của các thực thể đó. Do đó lớp là khái niệm mang tính
[trừu tượng hóa](/w/index.php?title=Tr%E1%BB%ABu_t%C6%B0%E1%BB%A3ng_h%C3%B3a&action=edit&redlink=1) rất cao. Ví dụ như lớp "người" dùng để chỉ những thực thể sống trên Trái Đất có những thuộc tính: có hai chân, hai bàn tay khéo léo, có tư duy, ngôn ngữ v.v và có phương thức: giao tiếp bằng ngôn ngữ, tư duy, đi, đứng bằng hai chân... Khi đó hai người cụ thể ông A, ông B là các đối tượng thuộc lớp người. Trong ngôn ngữ lập trình, ta cũng hiểu khái niệm lớp tương tự, cho nên ta có quá trình "Thực thể hóa" sau, tạo một đối tượng thuộc một lớp đã được ta định nghĩa (phân loại).
#### Thực thể (
*instance*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=17) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=17)] **Thực thể hóa** ( *instantiate*) là quá trình khai báo để có một tên (có thể được xem như là một biến) trở thành một đối tượng từ một lớp nào đó.
Một lớp sau khi được tiến hành thực thể hóa để có một đối tượng cụ thể gọi là một
**thực thể**. Hay nói ngược lại một thực thể là một đối tượng riêng lẻ của một lớp đã định trước. Như các biến thông thường, hai thực thể của cùng một lớp có thể có trạng thái nội tại khác nhau (xác định bởi các giá trị hiện có của các biến nội tại) và do đó hoàn toàn độc lập nhau nếu không có yêu cầu gì đặc biệt từ người lập trình. " Thực thể hóa: gần giống như cá nhân hóa. Một lớp khi được " cá nhân hóa" sẽ thành một đối tượng cụ thể.
#### Công cộng (
*public*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=18) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=18)]
Công cộng là một tính chất được dùng để gán cho các phương thức, các biến nội tại, hay các lớp mà khi khai báo thì người lập trình đã cho phép các câu lệnh bên ngoài cũng như các đối tượng khác được phép dùng đến nó.
- Ví dụ: Trong C++ khai báo
public: int my_var;thì biến my_var có hai tính chất là tính công cộng và là một integer cả hai tính chất này hợp thành đặc tính của biến my_var khiến nó có thể được sử dụng hay thay đổi giá trị của nó (bởi các câu lệnh) ở mọi nơi bên ngoài lẫn bên trong của lớp.
#### Riêng tư (
*private*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=19) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=19)]
Riêng tư là sự thể hiện tính chất đóng mạnh nhất (của một đặc tính hay một lớp). Khi dùng tính chất này gán cho một biến, một phương thức thì biến hay phương thức đó chỉ có thể được sử dụng bên trong của lớp mà chúng được định nghĩa. Mọi nỗ lực dùng trực tiếp đến chúng từ bên ngoài qua các câu lệnh hay từ các lớp con sẽ bị phủ nhận hay bị lỗi.
## Bảo tồn (
*protected*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=20) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=20)]
Tùy theo ngôn ngữ, sẽ có vài điểm nhỏ khác nhau về cách hiểu tính chất này. Nhìn chung đây là tính chất mà khi dùng để áp dụng cho các phương thức, các biến nội tại, hay các lớp thì chỉ có trong nội bộ của lớp đó hay các lớp con của nó (hay trong nội bộ một gói như trong Java) được phép gọi đến hay dùng đến các phương pháp, biến hay lớp đó.
So với tính chất riêng tư thì tính bảo tồn rộng rãi hơn về nghĩa chia sẻ dữ liệu hay chức năng. Nó cho phép một số trường hợp được dùng tới các đặc tính của một lớp (từ một lớp con chẳng hạn).
**Lưu ý**: Các tính chất công cộng, riêng tư và bảo tồn đôi khi còn được dùng để chỉ thị cho một lớp con cách thức kế thừa một lớp cha như trong C++.
#### Đa kế thừa (
*multiple inheritance*)[ [sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=21) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=21)]
Đây là một tính chất cho phép một lớp con có khả năng kế thừa trực tiếp cùng lúc nhiều lớp khác.
Vài điểm cần lưu ý khi viết mã dùng tính chất đa kế thừa:
- Khi muốn có một sự kế thừa từ nhiều lớp cha thì các lớp này cần phải độc lập và đặc biệt tên của các dữ liệu hay hàm cho phép kế thừa phải có tên khác nhau để tránh lỗi
"ambiguity". Bởi vì lúc đó trình dịch sẽ không thể xác định được là lớp con sẽ thừa kế tên nào của các lớp cha.
- Nhiều ngôn ngữ, ví dụ như Java, không có đa thừa kế, nhưng chúng có khái niệm giao diện
[Interface](/w/index.php?title=Interface&action=edit&redlink=1). Với [Interface](/w/index.php?title=Interface&action=edit&redlink=1), ta có thể có hầu hết các lợi ích mà đa thừa kế mang lại.
Ngoài các khái niệm trên, tùy theo ngôn ngữ, có thể sẽ có các chức năng OOP riêng biệt được cấp thêm vào.
## Lịch sử[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=22) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=22)]
Khái niệm về các đối tượng và thực thể trong khoa học máy tính được nhiều người biết đến từ hệ thống
[PDP-1](/w/index.php?title=PDP-1&action=edit&redlink=1) của [MIT](/wiki/Vi%E1%BB%87n_C%C3%B4ng_ngh%E1%BB%87_Massachusetts). Đây có lẽ là Ví dụ sớm nhất của kiến trúc cơ sở có khả năng thực. Một bằng chứng sớm khác của OOP được tìm thấy qua [Sketchpad](/w/index.php?title=Sketchpad&action=edit&redlink=1) viết bởi [Ivan Sutherland](/wiki/Ivan_Sutherland) trong năm [1963](/wiki/1963), tuy nhiên, đây chỉ là một ứng dụng chứ không là một [mẫu hình lập trình](/wiki/M%E1%BA%ABu_h%C3%ACnh#Trong_khoa_tin_h.E1.BB.8Dc).
Ngôn ngữ lập trình hướng đối tượng đầu tiên là
[Simula](/w/index.php?title=Simula&action=edit&redlink=1), ngôn ngữ này được thiết kế để dùng trong các việc mô phỏng, được sáng tạo bởi [Ole-Johan Dahl](/w/index.php?title=Ole-Johan_Dahl&action=edit&redlink=1) và [Kristen Nygaard](/w/index.php?title=Kristen_Nygaard&action=edit&redlink=1) thuộc Trung tâm Máy tính Na Uy ở [Oslo](/wiki/Oslo). Các kiến thức trong ngôn ngữ này sau đó đã được dùng trong nhiều ngôn ngữ khác, bắt đầu từ [Lisp](/wiki/Lisp) và [Pascal](/wiki/Pascal_(%C4%91%E1%BB%8Bnh_h%C6%B0%E1%BB%9Bng)) cho đến họ ngôn ngữ [Smalltalk](/wiki/Smalltalk).
Lập trình hướng đối tượng đã được phát triển như là phương pháp lập trình chủ đạo từ giữa
[thập niên 1980](/wiki/Th%E1%BA%ADp_ni%C3%AAn_1980) nguyên do đáng kể là việc ảnh hưởng của [C++](/wiki/C%2B%2B), một ngôn ngữ mở rộng của [C](/wiki/C_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)). Địa vị thống trị của OOP đã được củng cố vững chắc bởi sự phổ biến của các [GUI](/wiki/Giao_di%E1%BB%87n_ng%C6%B0%E1%BB%9Di_d%C3%B9ng_%C4%91%E1%BB%93_h%E1%BB%8Da) dành cho ngôn ngữ lập trình hướng đối tượng ngày càng tiện lợi. Một Ví dụ về quan hệ gần gũi của thư viện GUI động và ngôn ngữ OOP là phần mềm [Cocoa](/w/index.php?title=Cocoa&action=edit&redlink=1), nó là khung cơ sở của [Mac OS X](/wiki/Mac_OS_X) dược viết bằng [Objective C](/w/index.php?title=Objective_C&action=edit&redlink=1) (Objective C là một loại ngôn ngữ hướng đối tượng mở rộng của C với việc thông báo động). Công cụ cho OOP cũng được nâng cao phần "lập trình điều khiển theo sự kiện" (mặc dù khái niệm này không chỉ dành cho OOP).
Tại
[Zürich](/wiki/Z%C3%BCrich), [Niklaus Wirth](/wiki/Niklaus_Wirth) và những cộng sự đã theo dõi các đề tài như là [dữ liệu trừu tượng](/w/index.php?title=D%E1%BB%AF_li%E1%BB%87u_tr%E1%BB%ABu_t%C6%B0%E1%BB%A3ng&action=edit&redlink=1) và [lập trình mô đun](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_m%C3%B4_%C4%91un&action=edit&redlink=1). [Modula-2](/w/index.php?title=Modula-2&action=edit&redlink=1) bao gồm cả hai đặc tính đó. Thiết kế liền tiếp theo là [Oberon](/wiki/Oberon) bao gồm sự tiếp cận riêng biệt với việc định hướng đối tượng, các lớp,... Sự tiếp cận này không như Smalltalk, và cũng khác hẳn C++.
Các chức năng của hướng đối tượng cũng đã đang được thêm vào nhiều ngôn ngữ trong suốt thời gian đó kể cả
[Ada](/wiki/Ada_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)), [BASIC](/wiki/BASIC), [Lisp](/wiki/Lisp), [Fortran](/wiki/Fortran), [Pascal](/wiki/Pascal_(%C4%91%E1%BB%8Bnh_h%C6%B0%E1%BB%9Bng)) và nhiều nữa. Việc cộng thêm các chức năng đó cho các ngôn ngữ mà được trước đó không chủ định thiết kế cho chúng ngay từ đầu cũng thường dẫn tới nhiều khó khăn trong khả năng tương thích (với mã nguồn viết cho các phiên bản cũ) và khả năng bảo trì mã. Điển hình của trường hợp này là Pascal và Visual Basic. Các ngôn ngữ thuần túy hướng đối tượng, ở phía khác, lại thiếu các đặc tính mà nhiều người lập trình phụ thuộc vào. Để bắc cầu cho khoảng trống này, nhiều nỗ lực đã được xúc tiến để tạo ra các ngôn ngữ đặt cơ sở trên các phương pháp hướng đối tượng nhưng lại cho phép dùng nhiều đặc tính lập trình cấu trúc theo những phương cách "an toàn". Ngôn ngữ [Eiffel](/w/index.php?title=Eiffel_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1) của Bertrand Meyer đã sớm thành công với các mục tiêu này.
Trong thập niên đã qua,
[Java](/wiki/Java_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) được dùng rộng rãi một phần là do sự tương tự với [C](/wiki/C_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) và [C++](/wiki/C%2B%2B), nhưng có lẽ do phần khác quan trọng hơn là việc lắp đặt sử dụng [máy ảo](/wiki/M%C3%A1y_%E1%BA%A3o) mà chủ ý là thực thi cùng một mã nguồn cho nhiều [nền tảng](/w/index.php?title=N%E1%BB%81n_t%E1%BA%A3ng&action=edit&redlink=1) khác nhau. [.NET](/w/index.php?title=.NET&action=edit&redlink=1) của Microsoft cũng mở đầu với các chủ ý tương tự và cộng thêm việc hỗ trợ nhiều ngôn ngữ hay các sự biến thể của các ngôn ngữ cũ (như trường hợp C# và Visual Basic).
Gần đây, một số ngôn ngữ xuất hiện với chức năng chính là định hướng đối tượng nhưng lại tương thích được với phương pháp thủ tục như là
[Python](/wiki/Python_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) và [Ruby](/wiki/Ruby_(%C4%91%E1%BB%8Bnh_h%C6%B0%E1%BB%9Bng)). Bên cạnh Java, [C#](/wiki/C_th%C4%83ng) và [Visual Basic.NET](/wiki/Visual_Basic_2005) là hai ngôn ngữ OOP quan trọng hiện tại thiết kế bởi Microsoft.
Giống như
[lập trình thủ tục](/wiki/L%E1%BA%ADp_tr%C3%ACnh_th%E1%BB%A7_t%E1%BB%A5c) đã dẫn tới việc tinh lọc các kỹ thuật như là [lập trình cấu trúc](/wiki/L%E1%BA%ADp_tr%C3%ACnh_c%E1%BA%A5u_tr%C3%BAc), phần mềm hướng đối tượng hiện đại thiết kế các phương pháp bao gồm các sự tinh lọc. Chẳng hạn như là việc ứng dụng các [dạng thức thiết kế](/wiki/D%E1%BA%A1ng_th%E1%BB%A9c_thi%E1%BA%BFt_k%E1%BA%BF), [thiết kế bởi hợp đồng](/w/index.php?title=Thi%E1%BA%BFt_k%E1%BA%BF_b%E1%BB%9Fi_h%E1%BB%A3p_%C4%91%E1%BB%93ng&action=edit&redlink=1) và các [ngôn ngữ mô hình](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_m%C3%B4_h%C3%ACnh&action=edit&redlink=1) trong đó có [UML](/wiki/Ng%C3%B4n_ng%E1%BB%AF_m%C3%B4_h%C3%ACnh_h%C3%B3a_th%E1%BB%91ng_nh%E1%BA%A5t).
## Các ngôn ngữ[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=23) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=23)] *Bài chính: Ngôn ngữ lập trình hướng đối tượng* [C#](/wiki/C_th%C4%83ng) [C++](/wiki/C%2B%2B) [Common Lisp Object System](/w/index.php?title=Common_Lisp_Object_System&action=edit&redlink=1) [Eiffel](/w/index.php?title=Eiffel_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1) [Fortran](/wiki/Fortran)2003 [Java](/wiki/Java_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) [Objective-C](/w/index.php?title=Objective-C&action=edit&redlink=1) [OCaml](/wiki/OCaml) [Object Pascal](/w/index.php?title=Object_Pascal&action=edit&redlink=1) [Pascal](/wiki/Pascal_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) [Perl](/wiki/Perl) [PHP](/wiki/PHP) [Python](/wiki/Python_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) [Ruby](/wiki/Ruby_(%C4%91%E1%BB%8Bnh_h%C6%B0%E1%BB%9Bng)) [Simula](/w/index.php?title=Simula&action=edit&redlink=1) [Sleep](/w/index.php?title=Sleep&action=edit&redlink=1) [Smalltalk](/wiki/Smalltalk) [Ada](/wiki/Ada_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) [Visual FoxPro](/wiki/Visual_FoxPro) [Actionscript](/w/index.php?title=Actionscript&action=edit&redlink=1) [Visual Basic](/wiki/Visual_Basic)
## Đọc thêm[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=24) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=24)] [Grady Booch](/w/index.php?title=Grady_Booch&action=edit&redlink=1): *Object-Oriented Analysis and Design with Applications*, Addison-Wesley, [ISBN 0-8053-5340-2](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0805353402) [Alan Kay](/w/index.php?title=Alan_Kay&action=edit&redlink=1): [The Early History of Smalltalk](http://gagne.homedns.org/%7etgagne/contrib/EarlyHistoryST.html) [Erich Gamma](/w/index.php?title=Erich_Gamma&action=edit&redlink=1), [Richard Helm](/w/index.php?title=Richard_Helm&action=edit&redlink=1), [Ralph Johnson](/w/index.php?title=Ralph_Johnson&action=edit&redlink=1), [John Vlissides](/w/index.php?title=John_Vlissides&action=edit&redlink=1): *Design Patterns: Elements of Reusable Object Oriented Software*, Addison-Wesley, [ISBN 0-201-63361-2](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0201633612) [Bertrand Meyer](/w/index.php?title=Bertrand_Meyer&action=edit&redlink=1): *, Prentice Hall,* [Object-Oriented Software Construction](/w/index.php?title=Object-Oriented_Software_Construction&action=edit&redlink=1) [ISBN 0-13-629155-4](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0136291554) [James Rumbaugh](/w/index.php?title=James_Rumbaugh&action=edit&redlink=1), [Michael Blaha](/w/index.php?title=Michael_Blaha&action=edit&redlink=1), [William Premerlani](/w/index.php?title=William_Premerlani&action=edit&redlink=1), [Frederick Eddy](/w/index.php?title=Frederick_Eddy&action=edit&redlink=1), [William Lorensen](/w/index.php?title=William_Lorensen&action=edit&redlink=1): *Object-Oriented Modeling and Design*, Prentice Hall, [ISBN 0-13-629841-9](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0136298419) [Ivar Jacobson](/w/index.php?title=Ivar_Jacobson&action=edit&redlink=1): *Object-Oriented Software Engineering: A*, Addison-Wesley, [Use Case](/wiki/Use_case)-Driven Approach [ISBN 0-201-54435-0](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0201544350) [Harold Abelson](/w/index.php?title=Harold_Abelson&action=edit&redlink=1), [Gerald Jay Sussman](/w/index.php?title=Gerald_Jay_Sussman&action=edit&redlink=1), [Julie Sussman](/w/index.php?title=Julie_Sussman&action=edit&redlink=1): *Structure and Interpretation of Computer Programs*, The MIT Press, [ISBN 0-262-01153-0](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0262011530) [Martin Abadi](/w/index.php?title=Martin_Abadi&action=edit&redlink=1), [Luca Cardelli](/w/index.php?title=Luca_Cardelli&action=edit&redlink=1): *A Theory of Objects*, Springer-Verlag, [ISBN 0-387-94775-2](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0387947752) [Paul Harmon](/w/index.php?title=Paul_Harmon&action=edit&redlink=1), [William Morrissey](/w/index.php?title=William_Morrissey&action=edit&redlink=1): *The Object Technology Casebook - Lessons from Award-Winning Business Applications*, John Wiley & Sons, [ISBN 0-471-14717-6](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0471147176) [David A. Taylor](/w/index.php?title=David_A._Taylor&action=edit&redlink=1): *Object-Oriented Information Systems - Planning and Implementation*, John Wiley & Sons, [ISBN 0-471-54364-0](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0471543640) [Peter Eeles](/w/index.php?title=Peter_Eeles&action=edit&redlink=1), [Oliver Sims](/w/index.php?title=Oliver_Sims&action=edit&redlink=1): *Building Business Objects*, John Wiley & Sons, [ISBN 0-471-19176-0](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0471191760)
## Các bài liên hệ[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=25) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=25)]
|
|![]()
|
|[en:Object-oriented programming language](https://en.wikipedia.org/wiki/Object-oriented_programming_language) [en:Aspect-oriented programming](https://en.wikipedia.org/wiki/Aspect-oriented_programming) [en:Programming paradigm](https://en.wikipedia.org/wiki/Programming_paradigm) [en:Software componentry](https://en.wikipedia.org/wiki/Software_componentry) [en:Interface description language](https://en.wikipedia.org/wiki/Interface_description_language) [en:Distributed programming](https://en.wikipedia.org/wiki/Distributed_programming) [en:List of object-oriented programming terms](https://en.wikipedia.org/wiki/List_of_object-oriented_programming_terms) [en:Design pattern (computer science)](https://en.wikipedia.org/wiki/Design_pattern_(computer_science)) [en:Refactoring](https://en.wikipedia.org/wiki/Refactoring) [en:CORBA](https://en.wikipedia.org/wiki/CORBA) [en:Globus](https://en.wikipedia.org/wiki/Globus) [en:DCOM](https://en.wikipedia.org/wiki/DCOM) [en:Glossary of object-oriented programming](https://en.wikipedia.org/wiki/Glossary_of_object-oriented_programming)
## Tham khảo[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=26) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=26)] [Introduction to OOP](http://www.oopic.com/pgchap6.htm) [Introduction to Object Oriented Programming](http://www.eecs.utoledo.edu/~ledgard/oop/page2b.html) [Structured Programming vs Object-Oriented Programming](http://userpages.aug.com/frodo/oopstruc.html) [Object-oriented programming FAQ](http://www.objectfaq.com/oofaq2/) [Example of the subtyping problem](http://okmij.org/ftp/Computation/Subtyping/#Problem) [What are OOP's Jargons and Complexities](http://xahlee.org/Periodic_dosage_dir/t2/oop.html) [Object Oriented Design Principles](http://www.eventhelix.com/RealtimeMantra/Object_Oriented/)
- The report
["Object Orientation Redefined"](http://www.interaction-design.org/mads/articles/object_orientation_redefined.html)outlines how OO has been considered a thinking tool, i.e. "we view the world in objects", and how such an approach may further our understanding of object-oriented formalisation.
### Các phê phán[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&veaction=edit§ion=27) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit§ion=27)] [Criticism of OOP](http://www.geocities.com/tablizer/oopbad.htm) [Objects Have Failed](http://dreamsongs.com/ObjectsHaveFailedNarrative.html) [Arguments Against OOP (C2 wiki discussion)](http://c2.com/cgi/wiki?ArgumentsAgainstOop) [OOP Better in Theory than in Practice](http://www.devx.com/opinion/Article/26776) [Why Paul Graham is Creating a New Language Without OOP](http://www.paulgraham.com/noop.html)
|
|
· · · · Lập trình hướng đối tượng · · · · · · · · · ·
Chú ý: khoa học máy tính còn có thể được chia thành nhiều chủ đề hay nhiều lĩnh vực khác dựa theo

X-Cache: cp1065 hit/2, cp1053 miss


text:
Staňkovice, Kutná Hora
Bách khoa toàn thư mở Wikipedia
Staňkovice là một làng thuộc huyện Kutná Hora, vùng Středočeský, Cộng hòa Séc.[1]
Tham khảo[sửa | sửa mã nguồn]
- ^ “Struktura území ČR od 1.1.2008 do 1.1.2012 - xls”. Truy cập ngày 8 tháng 8 năm 2012.

markdown:
# Staňkovice, Kutná Hora
Bách khoa toàn thư mở Wikipedia
|Staňkovice|
|—
|![ Staňkovice (KH), náves.jpg](//upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Sta%C5%88kovice_%28KH%29%2C_n%C3%A1ves.jpg/250px-Sta%C5%88kovice_%28KH%29%2C_n%C3%A1ves.jpg)
![ Staňkovice (KH), náves.jpg](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Sta%C5%88kovice_%28KH%29%2C_n%C3%A1ves.jpg/250px-Sta%C5%88kovice_%28KH%29%2C_n%C3%A1ves.jpg)
![ ](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_Czech_Republic.svg/23px-Flag_of_the_Czech_Republic.svg.png)
[Cộng hòa Séc](/wiki/C%E1%BB%99ng_h%C3%B2a_S%C3%A9c) [Vùng](/w/index.php?title=V%C3%B9ng_c%E1%BB%A7a_C%E1%BB%99ng_h%C3%B2a_S%C3%A9c&action=edit&redlink=1) [Středočeský](/wiki/%C4%8Cechy_Trung_(v%C3%B9ng)) [Huyện](/w/index.php?title=Huy%E1%BB%87n_c%E1%BB%A7a_C%E1%BB%99ng_h%C3%B2a_S%C3%A9c&action=edit&redlink=1) [Kutná Hora](/wiki/Kutn%C3%A1_Hora_(huy%E1%BB%87n)) [Múi giờ](/wiki/M%C3%BAi_gi%E1%BB%9D) [CET](/wiki/Gi%E1%BB%9D_chu%E1%BA%A9n_Trung_%C3%82u)( [UTC+1](/wiki/UTC%2B1)) [DST](/wiki/Quy_%C6%B0%E1%BB%9Bc_gi%E1%BB%9D_m%C3%B9a_h%C3%A8)) [CEST](/wiki/Gi%E1%BB%9D_M%C3%B9a_h%C3%A8_Trung_%C3%82u)( [UTC+2](/wiki/UTC%2B2)) [NUTS 5](/wiki/C%C3%A1c_v%C3%B9ng_c%E1%BB%A7a_Li%C3%AAn_minh_ch%C3%A2u_%C3%82u) **Staňkovice** là một [làng](/w/index.php?title=L%C3%A0ng_c%E1%BB%A7a_C%E1%BB%99ng_h%C3%B2a_S%C3%A9c&action=edit&redlink=1) thuộc huyện [Kutná Hora](/wiki/Kutn%C3%A1_Hora_(huy%E1%BB%87n)), vùng [Středočeský](/wiki/%C4%8Cechy_Trung_(v%C3%B9ng)), [Cộng hòa Séc](/wiki/C%E1%BB%99ng_h%C3%B2a_S%C3%A9c). [[1]](#cite_note-1)
## Tham khảo[
[sửa](/w/index.php?title=Sta%C5%88kovice,_Kutn%C3%A1_Hora&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Sta%C5%88kovice,_Kutn%C3%A1_Hora&action=edit§ion=1)] [^](#cite_ref-1) [“Struktura území ČR od 1.1.2008 do 1.1.2012 - xls”](http://www.czso.cz/csu/klasifik.nsf/i/ii_struktura_uzemi_ceske_republiky/). Truy cập ngày 8 tháng 8 năm 2012.

X-Cache-Status: miss

X-Cache: cp1068 miss, cp1053 miss