
Trang chủ
All posts
Thứ Tư, 20 tháng 9, 2017
Chủ Nhật, 17 tháng 9, 2017

Office 2016 Pro Plus VL
Đây thực chất là bản Office 2016 Pro Plus VL tiếng Anh nhưng đã được thêm tiếng Việt do đó khi cài đặt có tùy chọn thêm ngôn ngữ tiếng Việt và được tích hợp các bản cập nhật tháng 6, 2017 dành cho Excel 2016, Outlook 2016, Powerpoint 2016 và Word 2016.
Link tải Google Drive: 32-bit | 64-bit
Phiên bản: 16.0.4266.1001
Nền tảng: Windows
Ngôn ngữ: Anh-Việt
Dung lượng: 32-bit: 1.19 Gb & 64-bit: 1.34 Gb
Hướng dẫn cài đặt
Mount ISO ra ổ đĩa ảo chạy file setup.exe để cào đặt chọn Customize
Trong tab Language nếu muốn thêm tiếng Việt thì tích vào ô Tiếng Việt (Lưu ý không bỏ tích được English vì sử dụng bộ cài ngôn ngữ Tiếng Anh do đó chỉ có thêm tùy chọn tiếng Việt)
Trong tab Installation Options chọn ứng dụng mà bạn muốn loại bỏ khi cài đặt.
Khi cấu hình xong bấm chọn Install Now bắt đầu quá trình cài đặt.
Link tải Google Drive: 32-bit | 64-bit
Phiên bản: 16.0.4266.1001
Nền tảng: Windows
Ngôn ngữ: Anh-Việt
Dung lượng: 32-bit: 1.19 Gb & 64-bit: 1.34 Gb
Hướng dẫn cài đặt
Mount ISO ra ổ đĩa ảo chạy file setup.exe để cào đặt chọn Customize
Trong tab Language nếu muốn thêm tiếng Việt thì tích vào ô Tiếng Việt (Lưu ý không bỏ tích được English vì sử dụng bộ cài ngôn ngữ Tiếng Anh do đó chỉ có thêm tùy chọn tiếng Việt)
Trong tab Installation Options chọn ứng dụng mà bạn muốn loại bỏ khi cài đặt.
Khi cấu hình xong bấm chọn Install Now bắt đầu quá trình cài đặt.
Thứ Bảy, 16 tháng 9, 2017

Giáo Trình C/C++
Giáo trình C của Aptech :
http://www.mediafire.com/view/axu859221jxb8mo/c_aptech.pdf
Giáo trình C của Đại học quốc gia hà nội :
http://www.mediafire.com/view/f51sd84jl8zv399/C_%C4%90HQGHN.pdf
Giáo trình C của thầy Phạm Văn Ất :
http://www.mediafire.com/view/ze9jtbqnah4tfp7/C_Ph%E1%BA%A1m_V%C4%83n_%E1%BA%A4t.pdf
Giáo trình C của thầy Nguyễn Hữu Tuấn :
http://www.mediafire.com/view/0ptf302fn02zcig/C_Nguyễn_Hữu_Tuấn.pdf
Giáo trình C của thầy Tiêu Kim Cương :
http://www.mediafire.com/view/2hf7lj27s74b4dq/C_Tiêu_Kim_Cương.pdf
Bài tập C ( có kèm theo lời giải ) :
http://www.mediafire.com/view/6nzgqlas33j4d08/Bài_tập_C_có_lời_giải_.pdf
Giáo trình C++ của Bưu chính viễn thông :
http://www.mediafire.com/view/pqmwcgw1gh2by8x/C++_Bưu_chính_viễn_thông.pdf
Giáo trình C++ của thầy Phạm Hồng Thái :
http://www.mediafire.com/view/gebvfaeoex30453/C++_Phạm_hồng_thái.pdf
Giáo trình giải thuật thầy Nguyễn Văn Linh :
http://www.mediafire.com/view/h4o77aq1toqg56b/Giáo_trình_giải_thuật_Nguyễn_Văn_Linh.pdf
Giáo trình tối ưu mã C thầy Nguyễn Văn Sơn :
http://www.mediafire.com/view/x43j2kco9y1w41o/Tối_ưu_mã_C_Nguyễn_Văn_Sơn_.pdf
Structured-programming-with-c-plus-plus_Kjell Backman 
http://www.mediafire.com/view/nigqk76v70cxn36/structured-programming-with-c-plus-plus_Kjell_Backman.pdf
C-programming-in-linux_David Haskins :
http://www.mediafire.com/view/vanax1ik0xp3857/c-programming-in-linux_David_Haskins.pdf
C++ For Dummies, 7th Edition_Stephen R. Davis.pdf :
http://www.mediafire.com/view/cxgbjekl6a18akn/C++_For_Dummies,_7th_Edition_Stephen_R._Davis.pdf
VC-MFC-Lê Ngọc Thạnh :
http://www.mediafire.com/view/dgufnrp0xobwwdn/VC-MFC-Lê_Ngọc_Thạnh.pdf
Bài giảng VC_Tran Minh Thai :
http://www.mediafire.com/view/hcqsd744ben9bmd/Bai_giang_VC_Tran_Minh_Thai.pdf
Phong cách lập trình C++ (River_11576) :
http://www.mediafire.com/view/1gal16qt4t29qqi/PCLT-C++_River_11576.pdf
Giải thuật và thuật toán thầy Lê Minh Hoàng :
http://www.mediafire.com/view/pk45a5ecm859w8r/Giai_thuat_va_thuat_toan_-_Le_Minh_Hoang.pdf
Data Structures and Algorithms - Alfred V. Aho :
http://www.mediafire.com/view/8elt8h9za7ix6n0/Data_Structures_and_Algorithms_-_Alfred_V._Aho.pdf
Beginning_c_5th_edition_Ivor Horton :
http://www.mediafire.com/view/ueyndx8282d7iy2/beginning_c_5th_edition.pdf
Moving from C to C++_Arunesh Goyal :
http://www.mediafire.com/view/5c2lt91v65kvby2/Moving_from_C_to_C++.pdf
Head First C_David Griffiths and Dwn Griffiths.pdf :
http://www.mediafire.com/view/0aymdf9ffp5ky8f/Head_First_C.pdf

Scott W.Ambler: Top 10 phương pháp DevOps hiệu quả – Phần 1

Ứng dụng những phương pháp DevOps sau đây để đạt được mục tiêu hợp tác hiệu quả, vận hành trơn tru hơn và code sạch hơn. DevOps đã trở thành một trong số những thuật ngữ được biết đến nhiều nhất trong ngành công nghiệp của chúng ta. Thế nhưng, một điều bất ngờ là vẫn chưa có một ý kiến thống nhất về định nghĩa thực sự DevOps là gì, bên cạnh tầm nhìn cao xa về sự hợp tác hiệu quả giữa team phát triển (developer) và team vận hành (operator). Mặc dù DevOps có thể mang ý nghĩa khác nhau đối với mỗi tổ chức, vẫn tồn tại những thủ thuật tối ưu cốt lõi đang nổi lên nhằm thúc đẩy mục đích chính là tăng cường hiệu quả hợp tác để cho ra những phần mềm tốt hơn. Trong bài viết này, tôi sẽ đi sâu hơn vào những thủ thuật đó. Cũng xin được nói trước, tôi sẽ không chỉ phân tích vấn đề này dưới góc độ quan điểm của developer. Tôi đã liệt kê những đề mục dưới đây theo độ ưu tiên, phương pháp đứng sau ít nhiều sẽ phụ thuộc vào phương pháp được nói đến trước đó.
Phương pháp 1: Chủ động tham gia với tư cách một Stakeholder
Một triết lý căn bản của DevOps chính là việc các lập trình viên, nhóm vận hành, và cả nhóm hỗ trợ phải thường xuyên làm việc gần nhau. Điều đó có nghĩa là họ phải xem nhau như những stakeholder quan trọng và chủ động tìm đến hợp tác. Một cách tiếp cận thường thấy trong cộng đồng agile chính là “khách hàng tại hiện trường”, được rút ra từ Extreme Programming (XP), có tác dụng thúc đẩy lập trình viên Agile làm việc sát với mục tiêu kinh doanh. Những chuyên gia Agile kỷ luật sẽ nâng cách tiếp cận này lên một tầm cao mới bằng việc thực thi phương pháp: “chủ động tham gia với tư cách Stakeholder”, trong đó yêu cầu dev phải làm việc trực tiếp với tất cả các stakeholder của họ, bao gồm cả đội vận hành và hỗ trợ – chứ không chỉ riêng gì những stakeholder đóng vai trò đối tác kinh doanh. Đây là mối quan hệ hai chiều: nhóm vận hành và hỗ trợ cũng phải sẵn lòng hợp tác với phía lập trình viên.Phương pháp 2: Kiểm thử tự động (Automated Testing)
Các nhà phát triển phần mềm Agile được cho là “chú trọng chất lượng” do quan tâm rất nhiều đến việc viết ra những đoạn code tốt và mong muốn test sản phẩm một cách liên tục và nhanh chóng nhất có thể. Kết quả là kiểm thử thoái lùi tự động (automated regression testing) trở thành một kỹ thuật phổ biến được các team Agile áp dụng, và thi thoảng còn mở rộng đến những phương pháp test-first như TDD (Test-Driven Development) và BDD (Behavior-Driven Development). Vì team Agile thường chạy các test-suite tự động của họ nhiều lần trong một ngày, và vì họ sửa những vấn đề họ bắt gặp được ngay tức khắc, nên họ đạt được chất lượng cao hơn những team không áp dụng. Đây là một tin đáng mừng cho những operator vẫn luôn kiên định rằng giải pháp được đưa ra phải đủ chất lượng trước khi được chấp thuận đưa vào sản xuất.
Phương pháp 3: Quản lý cấu hình tích hợp (Integrated Configuration Management)
Bằng cách tiếp cận quản lý cấu hình (CM) theo lối tích hợp, các nhóm phát triển không chỉ áp dụng CM ở mức độ solution truyền thống, mà còn cân nhắc đến vấn đề cấu hình sản xuất giữa solution của họ và điều kiện cơ sở hạ tầng của những bộ phận còn lại trong tổ chức của bạn. Điều này có thể coi là thay đổi rất lớn đối với một số developer, bởi họ thường quen với việc cân nhắc CM trên một phương diện duy nhất, là solution mà họ đang thực hiện. Trong môi trường DevOps, lập trình viên cần phải ý thức đến mục tiêu kinh doanh và “nhìn xa trông rộng” hơn. Làm sao để solution của họ vừa có thể làm việc với, và vừa tận dụng được những tài nguyên khác trong sản xuất? Liệu những tài nguyên khác có thể trở thành đòn bẩy cho solution đang được phát triển hiện tại? Điều này có nghĩa là dev team sẽ phải hiểu được, và quản lý được, toàn bộ những yếu tố phụ thuộc sản phẩm của họ. Phương pháp “quản lý cấu hình tích hợp” sẽ giúp bộ phận vận hành nắm được sức ảnh hưởng tiềm tàng của mỗi đợt phát hành mới, từ đó dễ dàng quyết định được thời điểm nào nên cho ra sản phẩm.Phương pháp 4: Quản lý thay đổi tích hợp (Integrated Change Management)
Theo quan điểm ngành IT, “quản lý thay đổi” (change management) là hành động đảm bảo sự tiến bộ thành công và có ý nghĩa của cơ sở hạ tầng IT, để hỗ trợ tổng thể tổ chức một cách hiệu quả hơn. Điều này chỉ trên cấp độ team dự án thôi đã rất khó khăn, bởi quá trình phát triển một solution độc nhất đòi hỏi phải áp dụng nhiều loại công nghệ, thậm chí cả những phiên bản khác nhau của cùng một loại công nghệ. Bởi DevOps giới thiệu cả những vấn đề thuộc cấp độ tổ chức kinh doanh liên quan đến vận hành vào trong hỗn hợp này, chiến lược “quản lý thay đổi tích hợp” có thể trở nên phức tạp hơn rất nhiều, do cùng lúc phải cân nhắc một số lượng lớn những solution đang chạy và tương tác trong sản xuất. Với phương pháp “quản lý thay đổi tích hợp”, team phát triển buộc phải làm việc sát với team vận hành để hiểu được một thay đổi bất kỳ về mặt công nghệ có thể dẫn đến kết quả như thế nào ở cấp độ tổ chức. Cách tiếp cận này phụ thuộc vào phương pháp tôi đã nêu ra trước đó là chủ động tham gia với tư cách một Stakeholder, quản lý cấu hình tích hợp và kiểm thử tự động.Phương pháp 5: Tích hợp liên tục (Continuous Integration)
Continuous Integration (CI) là nguyên tắc xây dựng và hợp thức hóa một dự án, thông qua kiểm thử thoái lùi tự động và thi thoảng là phân tích code mỗi khi code mới cập nhật được check vào hệ thống quản lý phiên bản (VCS). CI là một trong những phương pháp phát triển Agile đặc biệt gợi cảm (trong mắt một developer) và thường được gắn liền với DevOps. CI cho phép một lập trình viên phát triển một solution chất lượng và hiệu quả một cách an toàn, thông qua những bước nhỏ và đều đặn bằng cách gửi phản hồi ngay lập tức khi phát hiện hư hỏng trong code.SCOTT W.AMBLER LÀ MỘT KỸ SƯ PHẦN MỀM, TÁC GIẢ SÁCH VÀ HIỆN ĐANG LÀM SENIOR CONSULTING PARTNER TẠI SCOTT AMBLER + ASSOCIATES. ÔNG ĐÃ VIẾT RẤT NHIỀU NHỮNG CUỐN SÁCH VỀ PHƯƠNG PHÁP PHÁT TRIỂN AGILE CÓ KỶ LUẬT (DISCIPLINED AGILE DELIVERY), UNIFIED SOFTWARE DEVELOPMENT PROCESS, PHÁT TRIỂN PHẦN MỀM AGILE, UNIFIED MODELING LANGUAGE, VÀ PHÁT TRIỂN DỰA TRÊN CMM (CAPABILITY MATURITY MODEL).

Lập Trình Hướng Đối Tượng
Hoặc có thể vào ĐÂYđể tìm hiểu rõ hơn về principles of object oriented
Đó là theo quan điểm hàn lâm. Nói dễ hiểu hơn Object oriented programming(OOP) hay Lập trình hướng đối tượng. Được phát triển từ những năm 2000 nhằm thay thế cho lập trình thủ tục như C. Giúp người lập trình quản lý phát triển và quản lý code dễ dàng hơn.
Nhìn vào tên của nó bạn cũng có thể hình dung ra được. Ngôn ngữ lập trình này giải quyết các bài toán từ nhỏ đến lớn bằng cách quan sát và tưởng tượng những hành động, đặc điểm của thực thể thật ngoài đời sống và đem vào lập trình như một đối tượng ảo. Thể hiện qua các lớp (class), đối tượng (Object) mà hành động là các hàm(method) còn đặc điểm chính là các biến(variable)
Nói 1 cách hoa mỹ hơn
OOP is the art of observing of objects in their natural appearance and trying to capture the functional abstractnesses in descriptive programming way, and to visualize them as virtual-workable objects
OOP là nghệ thuật quan sát các đối tượng trong tự nhiên rồi cố gắng nắm bắt những hành động cùng đặc tính của chúng và biểu diễn dưới dạng đối tượng ảo trong ngôn ngữ lập trình
Ví dụ:
Xe (đời thực)-> class Xe(lập trình) -> Đối tượng Xe
Trong đó
Xe thật thì có màu, số bánh, tên xe
-> Class Xe (Biến màu, biến Số bánh. biến Tên)
-> Đối tượng xe(Màu,Số bánh, tên)
Lập trình hướng đối tượng luôn đi kèm 4 đặc điểm chính
Abstraction : tính trừu tượng.
Encapsulation : tính đóng gói.
Inheritance : tính kế thừa.
Polymorphism : tính đa hình.
Encapsulation : tính đóng gói.
Inheritance : tính kế thừa.
Polymorphism : tính đa hình.
Các thuộc tính của lập trình hướng đối tượng
- Tính đóng gói (encapsulation) và che giấu thông tin (information hiding)
Trước khi tìm hiểu tính đóng gói và che giấu thông tin, các bạn nên tìm hiểu cú pháp ngôn ngữ các thể hiện tính chất public, private, protected ......

Hình ảnh trên là một ví dụ về tính đóng gói và che giấu thông tin trong lập trình OOP
Như bạn thấy, viên thuốc được bao quanh bởi lớp vỏ chính là Class
Method và Variable là những thành phần bên trong viên thuốc, được bao lại, che giấu đi và không thể nhìn hoặc sử dụng nếu Class bên ngoài không cho phép.
Method và Variable là những thành phần bên trong viên thuốc, được bao lại, che giấu đi và không thể nhìn hoặc sử dụng nếu Class bên ngoài không cho phép.
Như vậy tính đóng gói có thể hiểu: Gói dữ liệu (data, ~ biến, trạng thái) và mã chương trình (code, ~ phương thức) thành một cục gọi là lớp (class) để dễ quản lí. Trong cục này thường data rất rối rắm, không tiện cho người không có trách nhiệm truy cập trực tiếp, nên thường ta sẽ che dấu data đi, chỉ để lòi phương thức ra ngoài
- Tính kế thừa (inheritance) Và đa hình(Polymorphism)

Khái niệm: Kế thừa là cách tạo lớp mới từ các lớp đã được định nghĩa từ trước
Lớp cha có thể chia sẻ dữ liệu và phương thức cho các lớp con, các lớp con khỏi phải định nghĩa lại những logic chung, giúp chương trình ngắn gọn. Nếu lớp cha là interface, thì lớp con sẽ di truyền những contract trừu tượng từ lớp cha
Giả sử ta có 2 class A và B:
- Class A: lớp cơ sở (lớp cha) - supper class
- Class B: lớp dẫn xuất (lớp con) - sub class
- Class A: lớp cơ sở (lớp cha) - supper class
- Class B: lớp dẫn xuất (lớp con) - sub class
Class B có thể dùng được hầu hết các phương thức (hàm) và các thuộc tính
(biến) của lớp A ngoại trừ các các phương thức và các hàm các tính chất private.
(biến) của lớp A ngoại trừ các các phương thức và các hàm các tính chất private.
Cài đặt: để cài đặt lớp kế thừa ta dùng toán tử ":" (trong C++, C#) và Extends (Java). Ví dụ B kế thừa A viết là: B:A
class A
{
....
}
class B:A // hoặc B extends A (java)
{
...
}
Chú ý:
- Một lớp cha có thể có nhiều lớp con
- Đến lượt mình mỗi lớp con lại có thể có các con khác
- Trong C++ cho phép đa kế thừa (một lớp con có thể nhận hơn 1 lớp cha)
- Java chỉ cho phép mỗi lớp con kế thừa 1 và chỉ một lớp cha/ từ khóa implement sẽ thay thế cho đa kế thừa từ C++
- Một lớp cha có thể có nhiều lớp con
- Đến lượt mình mỗi lớp con lại có thể có các con khác
- Trong C++ cho phép đa kế thừa (một lớp con có thể nhận hơn 1 lớp cha)
- Java chỉ cho phép mỗi lớp con kế thừa 1 và chỉ một lớp cha/ từ khóa implement sẽ thay thế cho đa kế thừa từ C++
Ví dụ: Code Java
Class nhân viên Employee có các thuộc tính name và salary
class Employee{
private String name;
private float salary;
public Employee() {
}
public Employee(String name, float salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
//method say
public void SayHello(){
System.out.println("Xin chaof");
}
}
//class Programmer có thêm 1 thuộc tính bonus kế thừa clas Employee
public class Programmer extends Employee{
private float bonus;
public float getBonus() {
return bonus;
}
public void setBonus(float bonus) {
this.bonus = bonus;
}
public Programmer(String name, float salary, float bonus) {
super(name, salary);
this.bonus = bonus;
}
public static void main(String args[]){
Programmer p=new Programmer("Đỗ Trung Quân", 1000, 500);
System.out.println("Tên lập trình viên : " + p.getName());
System.out.println("Luong Lap trinh vien : "+p.getSalary());
System.out.println("Bonus cua Lap trinh vien :"+p.getBonus());
}
}
Output:
Tên lập trình viên : Đỗ Trung Quân
Lương Lập trình viên : 1000.0
Bonus của lập trình viên : 500.0
Giải thích:
- Class Programmer mình không khai báo 2 biến name và salary nhưng nó vẫn sử dụng được. Vì Programmer đã kế thừa class Employee -> nó có thể sử dụng lại các constructor và get/set từ class cha. Kêu gọi chúng bằng từ khóa "super"
- Class Programmer mình không khai báo 2 biến name và salary nhưng nó vẫn sử dụng được. Vì Programmer đã kế thừa class Employee -> nó có thể sử dụng lại các constructor và get/set từ class cha. Kêu gọi chúng bằng từ khóa "super"
Tuy nhiên trong C++ không cho phép làm điều này nếu 2 biến ở class cha là private. Bạn có thể tham khảo link bên dưới để biết cách truy cập biến và hàm private lớp cha từ lớp con trong C++
-> Lớp bạn và lớp dẫn xuất trong C++
-> Lớp bạn và lớp dẫn xuất trong C++
(chú ý, trong java không có override biến mà chỉ có method).
Nếu bạn khai báo 1 biến name hoặc salary khác trong clas Programmer. Nó sẽ là 2 biến hoàn toàn khác 2 biến trong class Employee
- Tính trừu tượng, phương thức ảo:
Có câu "program to interfaces, not to concrete implementations". Nghĩa là khi viết chương trình theo phong cách hướng đối tượng, khi thiết kế các đối tượng, ta cần rút tỉa ra những đặc trưng của chúng, rồi trừu tượng hóa thành các interface, và thiết kế xem chúng sẽ tương tác với nhau như thế nào. Nói cách khác, chúng ta định ra các interface và các contract mà chúng cần thỏa mãn.
Nói 1 cách đơn giản thì bạn chỉ cần khai báo hàm trong lớp cha (access modifier, phương thức trả về, tên hàm, tham số truyền vào). Còn định nghĩa trong phần thân hàm bạn không cần quan tâm đến. Vì nó sẽ được override lại từ class kế thừa.
Định nghĩa: Đâ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 (chỉ khai báo). 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 (sự override từ lớp con). Tính chất này thường được gọi là sự trừu tượng của dữ liệu.
- Phương thức ảo là phương thức được định nghĩa ở lớp cơ sở (lớp cha) mà các lớp dẫn xuất (lớp con) muốn sử dụng phải định nghĩa lại. Dùng từ khoá virtual (c++) hay abstract (java)để khai báo phương thức ảo:
- Trong Class ảo có thể có phương thức ảo hoặc không nhưng phương thức ảo bắt buộc phải ở trong class ảo
- phương thức ảo không chứa body
- Khi kế thừa class ảo, bắt buộc phải viết lại phương thức ảo của nó
Code C++
virtual <kiểu trả về> <tên phương thức >(<d/s tham số>)
{
....
}
Code java
abstract <kiểu trả về> <tên phương thức >(<d/s tham số>)
{
....
}
Ví dụ
//Phải thêm từ khóa abstract trước class nếu nó chưa method abstract
abstract class Employee{
//method Abstract không có body
abstract public void SayHelloAbstract(String name);
public void SayHello(){
System.out.println("Xin chaof");
}
}
Viết lại class Programmer
class Programmer extends Employee{
private float bonus;
public float getBonus() {
return bonus;
}
public void setBonus(float bonus) {
this.bonus = bonus;
}
@Override // viết lại phương thức SayHelloAbstract
public void SayHelloAbstract(String name){
System.out.println("Xin chào : " + name);
}
public Programmer(String name, float salary, int bonus) {
super(name, salary);
this.bonus = bonus;
}
public static void main(String args[]){
Programmer p=new Programmer("Đỗ Trung Quân", 1000, 500);
p.SayHelloAbstract(p.getName());
System.out.println("Luong của bạn tháng này : "+p.getSalary());
System.out.println("Bonus cua bạn tháng này : "+p.getBonus());
}
}
Output:
Xin chào : Đỗ Trung Quân
Lương của bạn tháng này : 1000.0
Bonus cua bạn tháng này : 500.0
---------------------------------------------------------------------------------------------------------------------------------------------------- -Tính đa hình (polymorphism) - poly (nhiều) + phism(body) = nhiều hình thái. Tính đa hình được thể hiện qua việc viết lại các method(hàm) từ class cha thông qua class kế thừa nó hoặc việc triển khai các interface. Giả sử ta có 1 class abstract Animals và 3 class Ducks, Cats, Dogs sẽ kế thừa animals Trong hình ảnh vịt. chó và mèo đều kế thừa class Animals
abstract class Animals{
private String name;
public Animals() {
}
public Animals(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void Speak(String name, String sound){
System.out.println("Animals Speak!" );
}
}
//Class Ducks kế thừa Animals
class Ducks extends Animals{
public Ducks(String name) {
super(name);
}
@Override //viết lại hàm peak
public void Speak(String name, String sound){
System.out.println(name + " speaks: " + sound);
}
}
//Class Dogs
class Dogs extends Animals{
public Dogs(String name) {
super(name);
}
@Override //viết lại hàm peak
public void Speak(String name, String sound){
System.out.println(name + " speaks: " + sound);
}
}
//Class Cat
class Cats extends Animals{
public Cats(String name) {
super(name);
}
}
Và hàm main
public static void main(String[] args) {
//Tạo ra 3 đối tượng dog, cat ,duck
Dogs dog = new Dogs("Dog");
Ducks duck = new Ducks("Duck");
Cats cat = new Cats("Cat");
// gọi hàm Speak
dog.Speak(dog.getName(), "Woof");
duck.Speak(duck.getName(), "Quack");
cat.Speak(cat.getName(), "Meow");
}
Output:
Dog speaks: Woof
Duck speaks: Quack
Animals Speak!
Ở trên mình đã không override lại method Speak cho class Cats và bạn thấy. Khi mình gọi hàm nó sẽ refer đến Speak ở class cha (Animals) và in ra "Animals Speake!" thay vì "Cat speak: Meow" Như Dog và Duck.
Và đó là 4 đặc điểm chính trong lập trình hướng đối tượng OOP
Đăng ký:
Bài đăng (Atom)








