Bài giảng Lập trình hướng đối tượng (OOP) - Chương 4: Kế thừa - Văn Thị Thiên Trang

1. Kế thừa – Inheritance. 2. Phạm vi kế thừa 3. Đối tượng Super 4. Định nghĩa lại phương thức 5. Quan hệ qiữa các lớp 6. Toán tử instanceof 7. Vấn đề ép kiểu trong Java

pdf12 trang | Chia sẻ: candy98 | Lượt xem: 733 | Lượt tải: 2download
Bạn đang xem nội dung tài liệu Bài giảng Lập trình hướng đối tượng (OOP) - Chương 4: Kế thừa - Văn Thị Thiên Trang, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chương 4. Kế thừa 1 Chương 4. Kế thừa 1 Mục đích & yêu cầu „ Giải thích được: • Thừa kế là gì trong OOP. • Các loại thừa kế trong các ngôn ngữ OOP. „ Phân biệt được kỹ thuật Overloading và Overriding. „ Sử dụng được toán tử instanceOf và ép kiểu trong Java „ Giải thích được những tình huống có thể xảy ra khi ép kiểu. 2 Nội dung chính 1. Kế thừa – Inheritance. ế ừ2. Phạm vi k th a 3. Đối tượng Super 4. Định nghĩa lại phương thức 5 Quan hệ qiữa các lớp. 6. Toán tử instanceof 7. Vấn đề ép kiểu trong Java 3 1. Kế thừa – Khái niệm „ Kế thừa cho phép định nghĩa một lớp mới qua một lớp đã có „ Lớp dùng để kế thừa gọi là lớp cha (lớp cơ sở) „ Lớp kế thừa gọi là lớp con (lớp dẫn xuất). „ Lớp con có một số thành phần của lớp cha mà không cần định nghĩa „ Lớp con có thể định nghĩa thêm các thành phần riêng của mình. 4 Chương 4. Kế thừa 2 1. Kế thừa – Ưu điểm „ Thừa hưởng data và code từ một hay nhiều lớp khác. „ Kỹ thuật này giúp tái sử dụng code Î Tiết kiệ ô ứ lậ t ì h ô m c ng s c p r n , c ng sức kiểm tra code. 5 1. Kế thừa – Phân Loại „ Đơn kế thừa „ Đa kế thừa (thừa kế bội) „ Mỗi ngôn ngữ OOP hỗ trợ khả năng kế thừa riêng „ C++: Đa kế thừa „ C#, Java : Đơn kế thừa. 6 1. Kế thừa – Khai báo „ Cú pháp: „ Ví dụ: lớp SinhVien kế thừa từ lớp ConNguoi class extends { Khai báo các thành phần bổ sung của lớp con } class SinhVien extends CONNGUOI { . } 7 150 200 Thí dụ về thừa kế H 21 P02 Luan 25 150 P03 Quang 25 200 300 100 emp mng p 200 300 P01 oa 100 8 Chương 4. Kế thừa 3 2. Phạm vi kế thừa „ Lớp con được phép kế thừa các thành phần của lớp cha với phạm vi: • public • protected „ Thành phần protected: được phép kế thừa nhưng không được phép truy xuất bên ngoài lớp. 9 2. Phạm vi kế thừa Ví dụ: class ConNguoi { protected String hoTen; protected int namSinh; public ConNguoi(){ hoTen=“”; namSinh=1900;} public ConNguoi(String ht, int ns){ } public void ganHoTen(String ht){} bli id N Si h(i t ){ }pu c vo gan am n n ns public String layHoTen(){} public String layNamSinh(){} public void hienThi() {System.out.print(hoTen+” “ + namSinh);} } 10 2. Phạm vi kế thừa class SinhVien extends ConNguoi { protected double dtb; public void ganDtb(double d){} public double layDtb(){} public void hienThi(){} } Lớp SV có những thành phần nào? 11 3. Đối tượng super „ Đối tượng super dùng để truy xuất đến đối tượng thuộc lớp cha trong phạm vi lớp con. „ Sử dụng super: • Gọi phương thức khởi tạo lớp cha: super() Gọi phương thức thuộc lớp cha: super.tenPhươngThức() „ Lời gọi super() phải được gọi đầu tiên trong PTKT lớp con (sau khai báo). „ Nếu trong lớp con không gọi PTKT của lớp cha thì tự động gọi PTKT ngầm định của lớp cha. 12 Chương 4. Kế thừa 4 3. Đối tượng super Ví dụ sử dụng super class SinhVien extends ConNguoi{ protected double dtb; public SinhVien() { super(); dtb=0.0;} public SinhVien(String ht, int ns, double d) { super(ht,ns); dtb=d; } public void ganDtb(double d){} public double layDtb(){ } public void hienThi(){} } 13 4. Định nghĩa lại phương thức „ Override: Trong lớp con được phép định nghĩa lại (sửa code bên trong phương thức) các phương thức kế thừa từ lớp cha. „ Đối tượng của lớp con sẽ sử dụng phương thức đã định nghĩa lại. 14 „ Ví dụ: định nghĩa lại phương thức hienThi() trong lớp SinhVien: 4. Định nghĩa lại phương thức class SinhVien extends ConNguoi{ protected double dtb; public void hienThi() { super.hienThi(); System.out.println(“ ” + dtb); } } „ Sử dụng: SinhVien sinhVien = new SinhVien(“Ng Van A”,1985,7.5); sinhVien.hienThi();//gọi phương thức đã được định nghĩa lại. 15 4. Định nghĩa lại phương thức „ Khác biệt giữa overloading và overriding: • Overloading: Kỹ thuật cho phép nhiều hành vi trùng tên nhưng khác số lượng tham số hoặc kiểu tham số trong cùng một lớp. • Overriding: Kỹ thuật cho phép sửa code của một hành vi mà lớp con thừa kế từ lớp cha để lớp con phản ứng khác với lớp cha. 16 Chương 4. Kế thừa 5 overloading method: cùng tên, khác tham số, cùng lớp overriding method: cùng tên, cùng tham số, ở hai lớp cha con 17 Luyện tập „ Khai báo lớp SV (theo sơ đồ) „ Khai báo các lớp SVSP, SVTH kế thừa từ lớp SV. „ Chương trình: • Tạo 1 sinh viên SP • Tạo 1 sinh viên TH • Hiển thị thông tin của 2 SV trên 18 Sơ đồ các lớp SV #hoTen #namSinh #dtb SV(S i i d bl )+ tr ng, nt, ou e +hienThi() SVSP #noiTT SVTH #tenDT #diemTT +SVSP(..) +hienThi() +duocTN() #diemDT + SVTH() + hienThi() + duocTN() 19 Cài đặt lớp SV class SV { protected String hoTen; protected int namSinh; protected double dtb; public SV(String ht, int ns, double d) {hoTen=ht; namSinh=ns; dtb=d;} public void hienThi() { System.out.print(hoTen+” “+namSinh+” “+dtb); } } 20 Chương 4. Kế thừa 6 Cài đặt lớp SVSP 21 Cài đặt lớp SVTH 22 5 – Cơ chế liên kết muộn „ Tham chiếu của lớp cha có thể tham h ế đế đố ủ lớc i u n i tượng c a p con. „ Ví dụ: SinhVien s1,s2; s1 = new SVSP(“Ng V A”,1986,7.5,”Trg A”, 7.0); s2 = new SVTH(“Le Th B” 1987 7 ”VB” 8 0);, , , , . „ s1.hienThi(); ?? „ s2.hienThi(); ?? 23 5. Cơ chế liên kết muộn „ Cơ chế liên kết muộn: khi tham chiếu đến đối tượng thuộc lớp nào thì sử dụng các thành phần của lớp đó định nghĩa lại từ lớp cơ sở hoặc được kế thừa từ lớp cha. „ Ví dụ: với s1, s2 như trên s1.hienThi(); // sử dụng lớp SVSP s2.hienThi(); // sử dụng lớp SVTH 24 Chương 4. Kế thừa 7 5. Cơ chế liên kết muộn „ Tham chiếu của lớp cơ sở chỉ sử dụng được những phương thức định nghĩa lại. „ Ví dụ: không thực hiện được boolean d1 = s1.duocTN(); boolean d2 = s2.duocTN(); „ Để thực hiện được phải khai báo phương thức duocTN() ở lớp SV. 25 5. Ứng dụng liên kết muộn „ Chương trình quản lý danh sách sinh viên gồm 2 loại SVSP và SVTH. Thực hiện các thao tác: • Tạo lập và lưu trữ danh sách SV. • Liệt kê danh sách sv. • Liệt kê danh sách svsp. • Liệt kê danh sách sv được tốt nghiệp. 26 SV #hoTen #namSinh #dtb +SV() DSSV - ds[] - soSV +DSSV(int) +them(SV) Sơ đồ các lớp +hienThi() SVSP #noiTT SVTH #tenDT +lietKe() +lietKe(String) +dsTN() +loaiSV() +duocTN() #diemTT +SVSP() +hienThi() #diemDT +SVTH() +hienThi() +loaiSV() +loaiSV() +duocTN() +duocTN() 27 Lớp SV class SV { protected hoTen; protected namSinh; protected double dtb; public SV(String ht, int ns, double d){} public void hienThi(){ } public String loaiSV(){ return “”;} public boolean duocTN() { return true;} } 28 Chương 4. Kế thừa 8 Lớp SVSP class SVSP extends SV { protected String noiTT; protected double diemTT; public SVSP() {} public void hienThi(){} public String loaiSV(){ return “SP”;} public boolean duocTN() { return dtb>=5.0 && diemTT>=7.0;} } 29 Cài đặt lớp DSSV (1) class DSSV { private SV[] ds; private int soSV; public DSSV(int n) {ds = new SV[n]; soSV=0;} bli id h (SV )pu c vo t em s { if (soSV<ds.length) ds[soSV++]=s; } 30 Cài đặt lớp DSSV (2) public void lietKe() { for(int i=0;i<soSV;i++) ds[i].hienThi(); } public void lietKe(String loai) { for(int i=0;i<soSV;i++) if (ds[i].loaiSV().equals(loai)) ds[i].hienThi(); } 31 Cài đặt lớp DSSV (3) public void dsTN() { for(int i=0;i<soSV;i++) if (ds[i].duocTN()) ds[i].hienThi(); } 32 Chương 4. Kế thừa 9 Sử dụng lớp DSSV class SDDSSV { public static void main(String args[]) {DSSV k1=new DSSV(80); SV s; s = new SVSP(“Nguyen Van A”,1987,7.0,”Truong X”,7.0); k1.them(s); s = new SVTH(“Le Thi B”,1987,7.5,”Java”,7.0); k1.them(s); k1.lietKe(); k1.lietKe(“SP”); k1.dsTN(); } } 33 6. Toán tử instanceof Toán tử instanceof có 2 toán hạng Toán hạng trái: Một đối tượng Toán hạng phải: Tên 1 lớp Trả trị: true: Nếu đối tượng thuộc lớp này. false: nếu đối tượng không thuộc lớp này. 34 7- Quan hệ giữa các lớp „ Hai lớp không có quan hệ. „ Quan hệ cha con : tính thừa kế (đã học). „ Quan hệ bao gộp: Lớp có thành phần dữ liệu là thể hiện của 1 lớp khác. • Lớp thành phần là lớp bên ngoài. • Lớp thành phần là lớp bên trong (lớp nội) 35 Lớp có dữ liệu là một đối tượng của lớp ngoài Chương trình xuất hóa đơn Quan hệ bao gộp 36 Chương 4. Kế thừa 10 Lớp có dữ liệu là một đối tượng của lớp ngoài... Quan hệ bao gộp 37 Lớp có dữ liệu là một đối tượng của lớp ngoài... Quan hệ bao gộp 38 7. Lớp nội – Inner/nested class „ Là lớp được khai báo bên trong một lớp khác. „ Lớp trong truy xuất được lớp ngoài. „ Lớp ngoài phải có ít nhất một thành phần là instance của lớp trong và truy xuất các instance này. 39 Lớp nội – Inner/nested class Cú pháp: Lớp ngoài muốn truy cập Quan hệ bao gộp class Outter { . class Inner Lợi ích: Có hể iế d lớp trong thì phải định nghĩa 1 đối tượng lớp trong ( bằng toán tử new ) { } } t v t co e truy xuất lớp ngoài từ lớp trong mà không cần định nghĩa đối tượng lớp ngoài 40 Chương 4. Kế thừa 11 Lớp nội – Inner/nested class ƒLớp nội: Lớp ngoài không thể truy cập trực tiếp lớp trong Quan hệ bao gộp 41 Lớp nội – Inner/nested class ‰Lớp ngoài truy cập truy cập thành phần lớp trong thông qua đối tượng lớp trong. Lớp trong được dùng thành phần lớp ngoài Quan hệ bao gộp 42 Luyện tập „ Cần quản lý một danh sách nhân viên của 1 cơ quan gồm 2 loại: Nhân viên biên chế và nhân viên hợp đồng. „ Các thông tin chung: họ tên, phòng. • NVBC: hệ số lương, số năm CT. • NVHD: lương hợp đồng, Loại HĐ(NH,DH). „ Các thao tác trên danh sách nhân viên: • Tạo lập và lưu các nhân viên Liệt kê danh sách nhân viên• . • Liệt kê danh sách nhân viên theo loại: HĐ, BC • Tính tổng lương toàn bộ nhân viên. • Liệt kê danh sách nhân viên hợp đồng dài hạn. 43 NV #hoTen #phong +NV() +hienThi()DSNV Sơ đồ các lớp NVBC #hsLuong #soNamCT NVHD #luong #loaiHD - ds[] - soNV +DSNV(int) +them(NV) +lietKe() +loaiNV() +layLuong() +laNVHDDH() +NVBC(..) +hienThi() +NVHD() +hienThi() +lietKe(String) +tongLuong() +dsHDDH() +loaiNV() +loaiNV() +layLuong() +layLuong() +laNVHDDH()44 Chương 4. Kế thừa 12 Bài tập „ Viết chương trình nhập/ xuất một hóa đơn với số lượng mặt hàng nhập từ bàn phím. „ Viết chương trình nhập/ xuất danh sách hóa đơn với số lượng mặt hàng nhập từ bàn phím. „ Viết chương trình minh họa cho thiết kế sau: ế ìNgười Tên NămSinh HọcViên điểm1 điểm2 NhânViên Lương NgàyNhậnViệc PBK NhânViênCLCao PhòngBanKhoa MãPBK TênPBK NVQuảnLý Vi t chương tr nh khởi tạo một số đối tượng gồm: 3 học viên, 2 giaó viên 3 nhân viên quản lý. Xuất thông tin về các đối tượng điểm3 TrìnhĐộ Ngành NơiĐàoTạo GiáoViên ThùLaoGD PhụCâpCV . 45