Lập trình hướng đối tượng - Chương 3: Lập trình Hướng đối tượng với Java (tt)
Trong lớp con khai báo một thuộc tính có tên giống lớp cha thì trong lớp con thuộc tính của lớp cha bị che đi
Để truy cập tới thuộc tính trên lớp cha dùng super
Để phân biệt trong lớp con, dùng this
132 trang |
Chia sẻ: huyhoang44 | Lượt xem: 1217 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Lập trình hướng đối tượng - Chương 3: Lập trình Hướng đối tượng với Java (tt), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 3 Lập trình Hướng đối tượng với Java (tt)TRẦN MINH THÁIEmail: minhthai@huflit.edu.vnWebsite: www.minhthai.edu.vn Cập nhật: 22 tháng 03 năm 2017Nội dungVấn đề tái sử dụng codeKế thừa trong JavaTính đa hình trong JavaCài đặt interface trong JavaLập trình tổng quátVẤN ĐỀ TÁI SỬ DỤNG CODETái sử dụng codeLập trình cấu trúc: chương trình conOOP: nhiều loại đối tượng có thuộc tính, hành vi tương tự nhau tái sử dụng các lớp đã viếtTrong một lớp vẫn tái sử dụng phương thứcƯu điểm: Giảm chi phíNâng cao khả năng bảo trì và khả năng mô hình hóaCác hình thức tái sử dụng codeSao chép lớp cũ thành 1 lớp khác Hạn chế: Dư thừa, khó quản lý khi có thay đổiKết hợp: Lớp mới là tập hợp/ sử dụng các lớp đã cóKế thừa: Lớp mới phát triển thêm các thuộc tính hoặc phương thức từ lớp đã cóKẾT HỢPAGGREGATIONKết hợp (Aggregation)Thể hiện mối quan hệ “has-a”: Lớp mới chứa các đối tượng của lớp cũLớp mới: Lớp chứa/ Lớp toàn thểLớp cũ: Lớp thành phầnVí dụ:Lớp cũ: Điểm (Point)Lớp mới: Tam giác (Triangle) có 3 điểmLớp chứa tái sử dụng các thành viên của lớp thành phần thông qua đối tượngSơ đồ lớpSố lượng thành phần1 số nguyên dương (1, 2, 3...)Dải số (0..1, 1..n)Bất kỳ giá trị nào: *Không ghi: 1Ví dụ Lớp ToaDoDiempackage minhthai.oop.thietkelop;public class ToaDoDiem { private int x; private int y; public ToaDoDiem() { this.setX(0); this.setY(0); } public ToaDoDiem(int x, int y) { this.setX(x); this.setY(y); } public int getX() {return x;} public void setX(int x) {this.x = x;} public int getY() {return y;} public void setY(int y) {this.y = y;} public void hienThi() { System.out.printf("(%d, %d)\n", this.x, this.y); }}Ví dụ Lớp TamGiacNếu lớp thành phần khác package thì dùng lệnh importVí dụ Lớp TamGiac Bài tập 1Xây dựng một trò chơi xúc xắc. Cách chơi như sau:Mỗi hạt xúc xắc được gieo sẽ có giá trị ngẫu nhiên 1...6Hai người lần lượt gieo 1 hạt xúc xắcSau mỗi lượt gieo, số điểm của lượt đó được tích lũy vào số điểm của người chơiSau các lượt gieo theo quy định, người thắng cuộc là người có tổng số điểm lớn hơnHãy xác định các lớp cần thiết và cài đặt Xác định lớpXúc xắc (XucXac)Fields: giá trị của mặt (giaTri)Methods: sinh ngẫu nhiên giá trị mặt của xúc xắc (sinhGiaTri())Người chơi (NguoiChoi)Fields: tên (ten), điểm (diem)Methods: gieo xúc xắc (gieoXucXac())Xác định lớpTrận đấu (TranDau)Fields: xúc xắc (xucXac), 2 người chơi (nguoiChoi), số vòng chơi (soVong), người thắng cuộc (nguoiThang)Methods: bắt đầu (batDau()), kết thúc (ketThuc), hiển thị thông tin (hienThi()), thực hiện trận đấu (thucHienTranDau())Xác định lớpLớp XucXacpublic class XucXac { private int giaTri; public int getGiaTri() { return giaTri; } public void setGiaTri(int giaTri) { this.giaTri = giaTri; } public XucXac(){ giaTri=1; } public void sinhGiaTri(){ Random random = new Random(); this.giaTri=random.nextInt(5) + 1; }}Lớp NguoiChoipublic class NguoiChoi { private String ten; private int diem; public String getTen() { return ten; } public void setTen(String ten) { this.ten = ten; } public int getDiem() { return diem; } public void setDiem(int diem) { this.diem = diem; }Lớp NguoiChoi public NguoiChoi(String ten){ this.ten=ten; this.diem=0; } public void gieoXucXac(XucXac xucXac){ Scanner sn = new Scanner(System.in); System.out.print(">>> Hay nhan Enter de gieo xuc xac..."); sn.nextLine(); xucXac.sinhGiaTri(); this.diem+=xucXac.getGiaTri(); System.out.println("-- Diem: " + this.diem); }}Lớp TranDaupublic class TranDau { private XucXac xucXac; private NguoiChoi nguoiChoi1; private NguoiChoi nguoiChoi2; private NguoiChoi nguoiThang; private int soVong; public TranDau(String ten1, String ten2, int soVong){ this.nguoiChoi1 = new NguoiChoi(ten1); this.nguoiChoi2 = new NguoiChoi(ten2); this.xucXac = new XucXac(); this.soVong = soVong; }Lớp TranDaupublic void batDau(){ System.out.println("Tran dau bat dau..."); for(int i=1; i" + nguoiChoi1.getTen() + " gieo xuc xac"); nguoiChoi1.gieoXucXac(xucXac); System.out.println(">" + nguoiChoi2.getTen() + " gieo xuc xac"); nguoiChoi2.gieoXucXac(xucXac); }}Lớp TranDau public void ketThuc(){ int diem1= nguoiChoi1.getDiem(); int diem2=nguoiChoi2.getDiem(); if(diem1>diem2) this.nguoiThang=this.nguoiChoi1; else if(diem2>diem1) this.nguoiThang=this.nguoiChoi2; }Lớp TranDau public void hienThi(){ System.out.println("* Ket qua tran dau *"); System.out.printf("- Diem cua %s: %d", nguoiChoi1.getTen(), nguoiChoi1.getDiem()); System.out.printf("- Diem cua %s: %d", nguoiChoi2.getTen(), nguoiChoi2.getDiem()); if(nguoiThang!=null) System.out.printf("Nguoi thang cuoc: %s", nguoiThang.getTen()); else System.out.println("Tran dau hoa!!!"); } public void thucHienTranDau(){ batDau(); ketThuc(); hienThi(); }}public class XucXacTest { public static void main(String []args){ String ten1, ten2; int soVong; Scanner sn = new Scanner(System.in); System.out.print("> Ten nguoi choi 1: "); ten1=sn.nextLine(); System.out.print("> Ten nguoi choi 2: "); ten2=sn.nextLine(); System.out.print("> So vong dau: "); soVong=sn.nextInt(); TranDau tranDau = new TranDau(ten1, ten2, soVong); tranDau.thucHienTranDau(); }}Bài tập 2Hãy viết lại các lớp trong Bài tập 1 để thoả yêu cầu sau:Có thêm thuộc tính soBanThang ghi lại số bàn thắngCho biết số ván đấu (>2), nếu người chơi nào thắng quá bán đầu tiên thì sẽ thắng VD: Giả sử 2 người chơi phải chơi 3 ván đấu. Nếu người chơi nào thắng trước 2 ván thì người chơi đó thắng cả trận đấuNếu hòa thì tính điểm để kết luận người thắngGOM NHÓM ĐỐI TƯỢNGVấn đề gom nhóm đối tượngNhóm các đối tượng có cùng tập thuộc tính/ hành vi lại với nhau thành một lớpNhóm các đối tượng có cùng một số thuộc tính/ hành viVD: nhóm tất cả xe chạy bằng động cơ thành một nhóm, rồi phân thành các nhóm nhỏ hơn tuỳ theo loại xe (xe gắn máy, xe ô tô, xe tải, ...)Vấn đề gom nhóm đối tượngMỗi nhóm con là một lớp các đối tượng tương tự có chung một số đặc điểmQuan hệ giữa các nhóm con với nhóm lớn được gọi là quan hệ “is-a”Vấn đề gom nhóm đối tượngVí dụ:Một xe ô tô “is-a” xe động cơMột xe tải “is-a” xe động cơMột xe máy “is-a” xe động cơVấn đề gom nhóm đối tượngMối liên kết giữa các lớp trong quan hệ “is-a” xuất phát từ thực tế:Các lớp con có mọi thuộc tính/ hành vi của lớp chavà cộng thêm các thuộc tính/ hành vi khác Quan hệ “is-a” còn gọi là sự thừa kếTHỪA KẾINHERITANCEMục tiêu của thừa kếTạo lớp mới bằng cách phát triển từ lớp đã cóLớp mới kế thừa những thành viên đã có trong lớp cũLớp cũ: Lớp cha (superclass), lớp cơ sở (baseclass)Lớp mới: Lớp con (subclass), lớp dẫn xuất (derived class)Mục tiêu của thừa kếVí dụ:Lớp cũ: Điểm (ToaDoDiem)Kết hợp: Tam giác (TamGiac) có 3 điểmKế thừa: Tam giác vuông (TamGiacVuong)Sơ đồ thừa kế của lớpLớp cơ sởLớp cha – superclass (hoặc lớp cơ sở - base class)Lớp tổng quát hơn trong mối quan hệ “is-a”Các đối tượng thuộc lớp cha có cùng tập thuộc tính và hành viLớp dẫn xuấtLớp con – subclass (hoặc lớp dẫn xuất – derived class)Lớp cụ thể hơn trong một quan hệ “is-a”Các đối tượng thuộc lớp con có cùng tập thuộc tính và hành vi (do thừa kế từ lớp cha), kèm thêm tập thuộc tính và hành vi của riêng lớp conLớp cơ sở - lớp dẫn xuấtKế thừa phần lớn các thành viên dữ liệu và phương thức của lớp cơ sở Lớp dẫn xuấtCó thể bổ sung thêm các thành viên dữ liệu mới và các phương thức mới (ngoại trừ constructor, destructor)Lớp cơ sở trực tiếpLớp cơ sởLớp cơ sở gián tiếpClass AClass BClass CPhân loại thừa kếThừa kế đơn (single inheritance): chỉ có một lớp chaĐa thừa kế (multiple inheritance): có nhiều lớp chaSơ đồ quan hệ đối tượng(Object Relationship Diagram – ORD)Sự khác nhau giữa lớp cơ sở và lớp dẫn xuấtSự khác nhau giữa các lớp dẫn xuấtNguyên tắc biểu diễn sơ đồ thừa kếCác quan hệ thừa kế luôn được biểu diễn với các lớp dẫn xuất đặt dưới lớp cơ sở để nhấn mạnh bản chất phả hệ của quan hệƯu điểm của thừa kếTiết kiệm thời gian và công sứcTái sử dụng lại những lớp có sẵnGiảm lượng code phải thiết kế, viết, kiểm traTránh trùng lắp codeRút ngắn thời gian giúp LTV tập trung vào mục tiêuGiúp phân loại và thiết kế lớp dễ dàng, dễ quản lýKết hợp vs Kế thừaThừa kếKết hợpTái sử dụng mã nguồnthông qua lớpTái sử dụng mã nguồnthông qua đối tượngQuan hệ “is-a” Quan hệ “has-a”Ví dụ: Tam giác vuông là một loại tam giácVí dụ: Tam giác có 3 đỉnhĐỊNH NGHĨA LỚP THỪA KẾĐịnh nghĩa lớp kế thừaCú phápclass SubClass extends SuperClass{ Định nghĩa SubClass}Lớp con truy cập tới thành viên lớp cha qua từ khóa superMọi lớp trong Java đều kế thừa từ lớp tổng quát ObjectLớp Object cung cấp một số phương thức toString(), equals()Java chỉ cho phép đơn kết thừa: một lớp chỉ có thể kế thừa từ duy nhất 1 lớp khácChỉ định truy cập của lớp chapublic: cho phép lớp con kế thừa ở bất kỳ đâuKhông chỉ định: chỉ cho phép lớp con kế thừa khi cùng package với lớp chaChỉ định truy cập thành viênpublic, protected: cho phép lớp con được kế thừa và truy cập thuộc tính/phương thức trên lớp cha (!!!đối với public không cần kế thừa cũng truy cập được)Không chỉ định: chỉ cho phép lớp con ở cùng package được kế thừa và được truy cập tới thuộc tính/thành viên tương ứng của lớp chaprivate: lớp con không được kế thừa thuộc tính/phương thức này, không được truy cập vào thuộc tính/thành viên tương ứng trên lớp chaVí dụ chỉ định public cho class chapackage minhthai.oop.kethua.loppublic;public class LopCha { private int privateValue; protected int protectedValue; int noModifierValue; public int publicValue; private void privateMethod() { } protected void protectedMethod() { } void noModifierMethod() { } public void publicMethod() { }}Ví dụ class con cùng góipackage minhthai.oop.kethua.loppublic;public class LopCon extends LopCha { public void phuongThuc() { //Sử dụng thuộc tính của lớp cha super.privateValue = 0; //Lỗi super.protectedValue = 0; //OK super.noModifierValue = 0; //OK super.publicValue = 0; //OK //Gọi phương thức của lớp cha super.privateMethod(); //Lỗi super.protectedMethod(); //OK super.noModifierMethod(); //OK super.publicMethod(); //OK }}Ví dụ class con khác góipackage minhthai.oop.kethua.otherpack;import minhthai.oop.kethua.loppublic.*;public class LopCon extends LopCha { public void phuongThuc() { //Sử dụng thuộc tính của lớp cha super.privateValue = 0; //Lỗi super.protectedValue = 0; //OK super.noModifierValue = 0; //Lỗi super.publicValue = 0; //OK //Gọi phương thức của lớp cha super.privateMethod(); //Lỗi super.protectedMethod(); //OK super.noModifierMethod(); //Lỗi super.publicMethod(); //OK }}Ví dụ không chỉ định public class chaCùng gói: tương tự chỉ định publicKhác gói: không cho kế thừa!!!KHỞI TẠO ĐỐI TƯỢNG TRONG THỪA KẾKhởi tạo đối tượng trong thừa kếLớp con không thừa kế constructor của lớp chaCác constructor của lớp con tự động gọi default constructor của lớp cha (nếu có) Nếu lớp cha không có default constructor thì phải gọi phương thức khác default constructor của lớp chaCú pháp: super(parameterList)Thứ tự khởi tạo và huỷ trong thừa kếABC!!! Lớp cha phải được gọi khởi tạo trước lớp conNếu không Error: call to super must be first statement in constructorVí dụ khởi tạo đối tượng trong thừa kếVí dụ khởi tạo đối tượng trong thừa kế Ví dụ khởi tạo đối tượng trong thừa kế Ví dụ khởi tạo đối tượng trong thừa kế Đối tượng cha và conKhi tạo đối tượng con thì đối tượng cha cũng được tạo ra độc lậpĐối tượng con tham chiếu tới đối tượng cha qua super (tham chiếu này là private)Trong lớp con, nếu truy cập tới thành viên của lớp cha thì được thông qua super (tường minh, hoặc không tường minh): đối tượng con được xem như đối tượng thuộc lớp cha (upcasting)Upcasting và DowncastingUpcasting: đối tượng lớp con được nhìn nhận như đối tượng lớp cha: Thực hiện tự độngDowncasting: đối tượng lớp cha được nhìn nhận như đối tượng lớp con: Phải ép kiểuVí dụToán tử instanceofKiểm tra một đối tượng có phải đang là thể hiện của lớp hoặc giao diện nào đó không: true hoặc falseCú pháp: objectName instanceof ClassName objectName instanceof InterfaceNameCÁC BƯỚC THIẾT KẾ LỚP THỪA KẾCác bước thiết kế lớp thừa kếB1: Xác định các lớp đối tượng trong bài toán yêu cầuB2: Liệt kê các thành phần thuộc tính và phương thức cho từng lớpB3: Xác định những thuộc tính và phương thức chung giữa các lớp và tạo thành lớp cơ sở cho những lớp nàyB4: Vẽ sơ đồ lớpNhận biết kế thừa?class Aclass Bclass ABclass Aclass BVí dụCần quản lý thông tin của giảng viên và sinh viên trong một trường Đại học (tạo đối tượng thông qua constructor)Đối với sinh viên gồm các thông tin và hành vi:Họ tênTuổiSố tín chỉ đã tích luỹCập nhật số tín chỉHiển thị thông tinVí dụ (tt)Đối với giảng viên gồm các thông tin và hành vi:Họ tênTuổiHọc hàm (nếu có) và học vịHệ số lươngMức lương cơ bảnHiển thị thông tinPhân tích và thiết kế lớpB1: Xác định lớp đối tượng 1. Lớp Sinh viên (SinhVien) 2. Lớp Giảng viên (GiangVien)Phân tích và thiết kế lớpB2: Liệt kê các thuộc tính & phương thứcLớp SinhVienFields: hoTen (họ tên), tuoi (tuổi), soTinChi (số tín chỉ đã tích lũy) Methods: capNhatTinChi (Cập nhật số tín chỉ), hienThiSV (hiển thị thông tin sinh viên)Lớp GiangVienFields: hoTen (họ tên), tuoi (tuổi), hocVi (học hàm và học vị), heSoLuong (hệ số lương), luongCB (lương cơ bản) Methods: hienThiGV (hiển thị thông tin giảng viên)Phân tích và thiết kế lớpB3: Xác định những thông tin chungLớp SinhVienFields: hoTen (họ tên), tuoi (tuổi), soTinChi (số tín chỉ đã tích lũy) Methods: capNhatTinChi (Cập nhật số tín chỉ), hienThiSV (hiển thị thông tin sinh viên)Lớp GiangVienFields: hoTen (họ tên), tuoi (tuổi), hocVi (học hàm và học vị), heSoLuong (hệ số lương), luongCB (lương cơ bản) Methods: hienThiGV (hiển thị thông tin giảng viên)Phân tích và thiết kế lớpB3: tách thành lớp cơ sởTách những thông tin chung thành 1 lớp mới: Lớp con người (ConNguoi) gồm các thông tin và hành vi chungLớp ConNguoiFields: hoTen (họ tên), tuoi (tuổi)Methods: hienThi (hiển thị thông tin: hoTen và tuoi)Phân tích và thiết kế lớpB4: Sơ đồ lớppublic class ConNguoi { private String hoTen; private int tuoi; public String getHoTen() { return hoTen; } public void setHoTen(String hoTen) { this.hoTen = hoTen; } public int getTuoi() { return tuoi; } public void setTuoi(int tuoi) { this.tuoi = tuoi; } public ConNguoi(){ this.setHoTen(""); this.setTuoi(0); } public ConNguoi(String hoTen, int tuoi) { this.setHoTen(hoTen); this.setTuoi(tuoi); } public void hienThi() { System.out.println("- Ho ten: " + this.getHoTen()); System.out.println("- Tuoi: " + this.getTuoi()); }}public class GiangVien extends ConNguoi { private String hocVi; private double heSoLuong; private int luongCB; public GiangVien(String hoTen, int tuoi, String hocVi, double heSoLuong, int luongCB) { super(hoTen, tuoi); this.setHocVi(hocVi); this.setHeSoLuong(heSoLuong); this.setHeSoLuong(luongCoBan); } public GiangVien() { this.setHocVi(""); this.setHeSoLuong(0); this.setLuongCoBan(0); } public String getHocVi() { return hocVi; } public void setHocVi(String hocVi) { this.hocVi = hocVi; } public double getHeSoLuong() { return heSoLuong; } public void setHeSoLuong(double heSoLuong) { this.heSoLuong = heSoLuong; } public int getLuongCoBan() { return luongCoBan; } public void setLuongCoBan(int luongCoBan) { this.luongCoBan = luongCoBan; } public void hienThiGV() { super.hienThi(); System.out.println("- Hoc vi: " + this.getHocVi()); System.out.println("- He so luong: " + this.getHeSoLuong()); System.out.println("- Luong co ban: " + this.getLuongCoBan()); }}public class SinhVien extends ConNguoi { private int soTinChi; public int getSoTinChi() { return soTinChi; } public void setSoTinChi(int soTinChi) { this.soTinChi = soTinChi; } public SinhVien() { this.setSoTinChi(0); } public SinhVien(String hoTen, int tuoi) { super(hoTen, tuoi); this.setSoTinChi(0); } public void capNhatTinChi(int soLuong) { this.setSoTinChi(this.getSoTinChi() + soLuong); } public void hienThiSV() { super.hienThi(); System.out.println("- So tin chi tich luy: " + this.getSoTinChi()); }}public class SinhVienTest { public static void main(String []args) { System.out.println("*Tao sinh vien An:"); SinhVien sinhVien = new SinhVien("An", 17); System.out.println("*Thong tin cua An:"); sinhVien.hienThiSV(); System.out.println("*An hoc xong mon OOP"); System.out.println("*Cap nhat tin chi cho An:"); sinhVien.capNhatTinChi(4); System.out.println("*Thong tin cua An:"); sinhVien.hienThiSV(); }}Che thuộc tínhTrong lớp con khai báo một thuộc tính có tên giống lớp cha thì trong lớp con thuộc tính của lớp cha bị che điĐể truy cập tới thuộc tính trên lớp cha dùng superĐể phân biệt trong lớp con, dùng thisVí dụVí dụPhương thức cùng tênNạp chồng phương thức (Overloading): giữ tên và giá trị trả về, thay đổi đối sốGhi đè phương thức (Overriding): giữ nguyên tên, giá trị trả về và đối sốPhương thức thức cùng tênLiên kết tĩnh: Khối mã lệnh của phương thức được xác định khi dịchLiên kết động: Khối mã lệnh của hàm được xác định khi chương trình thực thiLiên kết lời gọi hàm: xác định địa chỉ trên bộ nhớ của khối mã lệnh thực hiện phương thức khi có lời gọi!!!Nạp chồng phương thức: thực hiện liên kết độngĐịnh nghĩa lại phương thức lớp cơ sởLớp con có thể định nghĩa lại các phương thức kế thừa từ lớp cha dùng kỹ thuật overriding!!!Phương thức ở lớp cha và lớp con phải cùng nguyên mẫuPhân biệt Overriding với Overloading phương thứcpublic class LopCha { private int money; public LopCha() { this.money = 1000; } public void rutTien(int soTien) { this.money -= soTien; System.out.println("Tien cua cha: " + this.money); }}public class LopCon extends LopCha { private int money; public LopCon() { this.money = 500; } public void hienThi(){ System.out.println("Tien cua con: " + this.money); }}public class NonOverrideTest { public static void main(String []args){ LopCon lopCon = new LopCon(); lopCon.rutTien(200); lopCon.hienThi(); }}public class LopCha { private int money; public LopCha() { this.money = 1000; } public void rutTien(int soTien) { this.money -= soTien; System.out.println("Tien cua cha: " + this.money); }}public class LopCon extends LopCha { private int money; public LopCon() { this.money = 500; } public void rutTien(int soTien) { this.money -= soTien; System.out.println("Tien cua con: " +this.money); }}public class OverrideTest { public static void main(String []args){ LopCon lopCon = new LopCon(); lopCon.rutTien(200); }}Cấm overriding phương thứcĐảm bảo tính đúng đắn: overrideing phương thức có thể gây ra sự sai lạc về ý nghĩaTính hiệu quả: giảm thời gian xử lý lời gọi phương thức định nghĩa phương thức với từ khóa finalVí dụLỗiOverriding equals()Không thể dùng toán tử so sánh == để so sánh 2 đối tượngMọi lớp được kế thừa phương thức equals từ lớp Object định nghĩa lại cho phù hợpHai đối tượng bằng nhau khi thỏa mãn 2 điều kiện:Cùng thuộc một lớpGiá trị của mọi thuộc tính là như nhau !!!2 giá trị tham chiếu bằng nhau đối tượng bằng nhauOverriding equals() cho lớp ConNguoiOverriding equals() cho lớp ConNguoi*** Dung toan tu ==>>> nguoi1 != nguoi2*** Dung phuong thuc equals>>> nguoi1 == nguoi2TÍNH ĐA HÌNH TRONG JAVATính đa hình trong JavaKhái niệmTrừu tượng hoáHiện thực đa hình trong JavaĐa hình (polymorphism)poly = manymorphism = formsKhái niệm Đa hìnhĐa hình là hiện tượng các đối tượng thuộc các lớp khác nhau có khả năng hiểu cùng một thông điệp theo các cách khác nhau hoặc nhiều kiểu tồn tại của một đối tượngKhái niệm Đa hìnhLandRoverobjectFordobjectHondaobjectMoveLandRover dùng 2.0 L engine để moveFord dùng V engine để moveHonda dùng i-vtec để moveKhái niệm Đa hìnhĐa hình phương thức: Cùng một phương thức có thể được thực hiện khác nhau trên các loại đối tượng khác nhauĐa hình đối tượng: nhìn nhận đối tượng theo nhiều kiểu khác nhauĐa hình phương thứcCác lớp dẫn xuất cài đặt cùng một phương thức của lớp cơ sở, nhưng mỗi lớp dẫn xuất có cách cài đặt khác nhau overriding phương thứcKhái niệm Đa hìnhPhân biệt Overloading vs Overriding?Overloading (nạp chồng) phương thức: giữ tên và giá trị trả về, chỉ thay đổi đối sốOverriding (ghi đè) phương thức: giữ nguyên tên, giá trị trả về và đối số (không thay đổi nguyên mẫu phương thức)Khái niệm Đa hìnhMuốn đa hình phương thức cho các đối tượng trong các lớp?Các lớp phải có mối quan hệ thừa kếCác phương thức đa hình phải cùng chung mẫu trong lớp cơ sở và lớp dẫn xuất (overriding)Khái niệm Đa hìnhPHƯƠNG THỨC TRỪU TƯỢNGABSTRACT METHODVấn đề overriding phương thứcKế thừa giúp khái quát hóa thông tin cụ thể của lớp đối tượng thành các thông tin chung (trừu tượng hóa đối tượng)Vấn đề overriding phương thứcMức độ trừu tượng hóa càng cao phương thức chung cho các đối tượng sẽ ở mức tổng quát nhấtPhương thức ở mức tổng quát nhất có thể không có cách hiện thực cụ thể phương thức rỗngVí dụ:Lớp Hình chữ nhật, Hình tam giác, Hình tròn có thể trừu tượng thành Lớp Hình học nói chung Muốn tính diện tích cho một Hình học?Vấn đề overriding phương thứcPhương thức không cài đặt được gọi là phương thức trừu tượng (abstract)Cú pháppublic abstract dataType methodName(listParameter);LỚP TRỪU TƯỢNGABSTRACT CLASSLớp trừu tượngKhi lớp cơ sở có tồn tại phương thức abstract thì lớp đó được gọi là lớp trừu tượng (abstract class)Bổ sung từ khoá abstract phía trước classpublic abstract class ClassName{ Khai báo thuộc tính; public abstract dataType methodName(listParameter); Định nghĩa các phương thức khác;}Đặc điểm lớp trừu tượngPhương thức trừu tượng không được phép định nghĩa tại lớp cha (kết thúc khai báo bằng dấu ;)Lớp con kế thừa từ lớp trừu tượng phải định nghĩa nội dung của phương thức trừu tượngChỉ định truy cập không được chặt hơn lớp chaKhông được tạo đối tượng từ lớp trừu tượngLớp trừu tượng vẫn có constructorHãy sử dụng kỹ thuật kế thừa và đa hình để viết chương trình cho phép tạo đối tượng hình tròn và hình chữ nhật. Sau đó tính và in thông tin diện tích của mỗi hìnhHình tròn gồm các thông tin: Tọa độ tâm và bán kínhHình chữ nhật gồm các thông tin: Tọa độ góc trên bên trái, chiều ngang và chiều đứngVí dụVí dụ Xác định lớp và thông tin của lớpLớp hình tròn (HinhTron):Fields: Toạ độ tâm (x, y), bán kính (banKinh)Methods: Tính diện tính (tinhDienTich)Lớp hình chữ nhật (HinhChuNhat):Fields: Toạ độ góc (x, y), kích thước (chieuNgang, chieuDung)Methods: Tính diện tích (tinhDienTich)Ví dụ Xác định các điểm chung của các lớpLớp hình tròn (HinhTron):Fields: Toạ độ tâm (x, y), bán kính (banKinh)Methods: Tính diện tính (tinhDienTich)Lớp hình chữ nhật (HinhChuNhat):Fields: Toạ độ góc (x, y), kích thước (chieuNgang, chieuDung)Methods: Tính diện tích (tinhDienTich)Ví dụ Cần đa hình phương thức tinhDienTich()Tuy nhiên công thức tính diện tích chung cho cả hình tròn và hình chữ nhật: rỗng phương thức trừu tượng public abstract double tinhDienTich();Lớp HinhHoc phải là trừu tượngpublic abstract class HinhHocVí dụ Lớp HinhHocLớp HinhTronLớp HinhChuNhatLớp HinhHocTestGIAO DIỆNINTERFACEGiao diệnSử dụng trong trường hợp đa kế thừa (kế thừa từ nhiều lớp)Giao diện chỉ quy định các phương thức phải có, nhưng không định nghĩa cụ thểTách rời đặc tả mức trừu tượng và triển khai cụ thểĐảm bảo tính cộng tác trong phát triển phần mềmCác giao diện có thể kế thừa nhauGiao diệnCú phápModifier interface InterfaceName { Khai báo các hằng số Khai báo các phương thức}Triển khai giao diệnModifier class ClassName implements Interface1, Interface2 { 1. Định nghĩa lớp 2. Định nghĩa tất cả các phương thức của Interface1 và Interface2}Kế thừa và triển khai giao diệnModifier class SubClass extends SuperClass implements Interface1, Interface2 { Định nghĩa SubClass kế thừa từ SuperClass Định nghĩa tất cả phương thức của Interface1 và Interface2}Giao diện vs Trừu tượngGiao diệnTrừu tượngChỉ được phép có thành viên hằngCó thể có thuộc tínhMọi phương thức là trừu tượng với chỉ định truy cập publicNgoài phương thức trừu tượng, có thể có phương thức riêngKhông có phương thức khởi tạoCó phương thức khởi tạoMột lớp có thể triển khai nhiều giao diệnMột lớp chỉ có thể kế thừa từ một lớp trừu tượngKhông tái sử dụng mã nguồnCó tái sử dụng mã nguồnVí dụGiao diện HinhHocLớp HinhTronLớp HinhChuNhatLập trình tổng quátXây dựng chương trình có thể làm việc với nhiều kiểu dữ liệu khác nhau trên cùng thao tác xữ lýCách thức lập trình tổng quátCách thức lập trình tổng quátBài tậpThiết kế chương trình quản lý danh sách các hình vẽ, gồm các loại hình vẽ sau:Hình chữ nhật: tọa độ tâm, chiều rộng và chiều dài.Hình tròn: tọa độ tâm, bán kính.Hình tam giác: tọa độ tâm, chiều dài 3 cạnh.Chức năng: nhập, xuất danh sách các hình, cho biết số lượng và hình có diện tích lớn nhất của từng loại. Yêu cầu: vẽ sơ đồ lớp, định nghĩa tất cả lớp với những phương thức cần thiết. Q&A
Các file đính kèm theo tài liệu này:
- lap_trinh_dung_javachuong3_laptrinhhuongdoituongvoijava_p2_1701.pptx