Lập trình hướng đối tượng - Chương 6: Đa hình
Phâ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)
45 trang |
Chia sẻ: huyhoang44 | Lượt xem: 683 | 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 6: Đa hình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ĐA HÌNHKhoa Công nghệ thông tinTrường Đại học Ngoại ngữ - Tin học, TP.HCMCHƯƠNG 6: 1Khái niệm Đa hìnhCác bước xây dựng chương trình có tính đa hìnhTừ khóa ‘base’Phương thức trừu tượng (abstract method)Từ khóa ‘new’ với phương thứcNỘI DUNG2Đóng gói (Encapsulation) và Giao diện (Interface)Ẩn chi tiết của lớp (Đóng gói), chỉ cung cấp các phương thức cần thiết để dùng (Giao diện) Thừa kế (Inheritance)Tạo lớp mới thừa kế lớp đã cóĐa hình (Polymorphism)Khả năng tạo ra các lớp dẫn xuất, cài đặt cùng một method của lớp cơ sở theo những cách khác nhau (tùy từng lớp dẫn xuất)3 nguyên tắc lập trình hướng đối tượng3Khái niệm đa hình4Đa hình (polymorphism)poly = manymorphism = formsKhái niệm Đa hình5Đ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 để move6Khái niệm Đa hình7Đ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 Cùng nguyên mẫu phương thức cho các lớp khác nhau: overriding phương thứcĐa hình đối tượng: nhìn nhận đối tượng theo nhiều kiểu khác nhauPhâ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ình8Đ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 nhauKhái niệm Đa hình9Nhờ đặc tính của thừa kế giúp:Tạo lớp mới dựa trên lớp đã có (lớp cơ sở), thừa hưởng những gì lớp cơ sở cóThêm một số Field và Method mới vào lớp mớiCài đặt lại phương thức đã được lớp cơ sở cung cấpKhái niệm Đa hình10Các bước xây dựng tính đa hình11Các bước xây dựng tính đa hình12Lớp cơ sở: Lớp CarCác bước xây dựng tính đa hìnhpublic class Car{ public virtual void Move() { Console.WriteLine("Car: Move"); }}13Từ khóa ‘virtual’Cho phép lớp dẫn xuất có quyền thay đổi cách phương thức này làm việc (cài đặt lại)Từ khóa này có thể dùng choMethodPropertiesIndexerseventsCác bước xây dựng tính đa hình14Lớp dẫn xuất: có thể cung cấp một cách cài đặt khác của phương thức ở lớp cơ sởCác bước xây dựng tính đa hình15Để cài đặt lại phương thứcTạo một hàm giống như lớp cơ sở (copy)Thêm từ khóa override trước phương thứcCác bước xây dựng tính đa hìnhpublic class LandRover : Car{ public override void Move() { Console.WriteLine(“Move: LandRover (2.0 L engine)"); }}16Nếu trong lớp cơ sở không có từ khóa virtual trước phương thức chúng ta muốn override, thì chúng ta không thể override phương thức đóvirtual: “tôi cho phép bạn làm gì khác với phương thức này”override: “bạn cho phép tôi, tôi sẽ làm một số điều khác biệt với nó” Các bước xây dựng tính đa hình17Chú ý:Chúng ta không phải bắt buộc phải override các phương thức lớp cơ sởNếu không override thì sao?Các bước xây dựng tính đa hình18Các bước xây dựng tính đa hìnhpublic class Ford : Car{ public override void Move() { Console.WriteLine(“Move: Ford (V engine)"); }}public class Honda : Car{ public override void Move() { Console.WriteLine(“Move: Honda (i-vtec)"); }}19Lớp LandRover, Ford, Honda thừa kế từ lớp Car nên có thể dùng như lớp CarCác bước xây dựng tính đa hìnhCar car1 = new Car();Car car2 = new LandRover();Car car3 = new Ford();Car car4 = new Honda();20Chúng ta có thể gọi phương thức Move(). Tùy theo kiểu thực sự mà các cài đặt khác nhau sẽ được gọiGọi cùng phương thức (cùng signature) các phương thức khác nhau được chạyCác bước xây dựng tính đa hìnhcar1.Move();car2.Move();car3.Move();car4.Move();Move: CarMove: LandRover (2.0 L engine)Move: Ford (V engine)Move: Honda (i-vtec)Press any key to continue . . .21Từ khóa ‘base’: Truy cập các constructor của lớp cơ sở (đã học)Truy cập các thành viên không private từ lớp cơ sởThông thường ta không cần dùng ‘base’ để truy cập thành viên lớp cơ sởXem lại từ khóa ‘base’22Khi override phương thức, chúng ta có thể dùng base để truy cập phiên bản gốc của method nàyXem lại từ khóa ‘base’public override void Move(){ base.Move(); Console.WriteLine("Move: LandRover (2.0 L engine)");}23Từ khóa ‘this’Gọi constructor khác của lớp hiện tạiGiải quyết name hiding (truy cập field của lớp)Từ khóa ‘base’Gọi constructor của lớp cơ sởGọi method của lớp cơ sở (khi viết hàm override)this và base24Phương thức trừu tượng (abstract method)25Loại bỏ những thông tin cụ thể, giữ lại các thông tin chungMức độ trừu tượng hoá được thể hiện trên cây kế thừaTrừu tượng là gì?26Mức độ trừu tượng càng cao thông tin chung và phương thức chung càng tổng quát Có thể tồn tại những phương thức không thể xác định thực hiện như thế nàoVí 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 đề trừu tượng27Khi một phương thức trong lớp cơ sở không làm gì cả, viết hàm này như thế nào?Cung cấp cài đặt giả cho phương thức (dummy implementation)Không cài đặt phương thức (dùng từ khóa abstract)Thêm từ khóa abstract trước lớpThêm từ khóa abstract trước phương thức không cài đặtAbstract methodabstract public class Car{ public abstract void Move();}28Lớp có chứa phương thức abstract thì bắt buộc phải khai báo lớp đó là lớp abstractKhi lớp là abstract, thì không thể tạo đối tượng (chúng ta cần tạo đối tượng của các lớp dẫn xuất không trừu tượng)Abstract methodCar car1 = new Car(); // errorCar car2 = new LandRover();Car car3 = new Ford();Car car4 = new Honda();29Lớp trừu tượng có thể có các virtual method, method thông thường khácTrong lớp dẫn xuất, để cài đặt abstract method, chúng ta vẫn dùng từ khóa ‘override’override:override cho virtual methodoverride cho abstract methodAbstract method30Lớp HinhTron (hình tròn) gồm các thông tin:Bán kínhLớp HinhChuNhat(hình chữ nhật) gồm các thông tin:Chiều ngangChiều đứngHãy sử dụng kỹ thuật kế thừa và đa hình để viết chương trình cho phép nhập thông tin của đố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ình Bài tập ví dụ31Xác định lớp và thông tin của lớpLớp HinhTronThuộc tính: r (bán kính), s (diện tích)Phương thức: Nhap (nhập thông tin), TinhDienTich (tính diện tích)Lớp HinhChuNhatThuộc tính: m (chiều ngang), n (chieu dung), s (diện tích) Phương thức: Nhap (nhập thông tin), TinhDienTich (tính diện tích)Bài tập ví dụ 32Áp dụng kỹ thuật kế thừa Xác định các điểm chung của các lớpLớp HinhTronThuộc tính: r (bán kính), s (diện tích)Phương thức: Nhap (nhập thông tin), TinhDienTich (tính diện tích)Lớp HinhChuNhatThuộc tính: m (chiều ngang), n (chieu dung), s (diện tích) Phương thức: Nhap (nhập thông tin), TinhDienTich (tính diện tích)Bài tập ví dụ 33Tạo lớp mới từ những điểm chung nàyLớp HinhHocThuộc tính: s (diện tích)Phương thức: Nhap (nhập thông tin), TinhDienTich (tính diện tích)Trong đó: các phương thức không làm gì cả abstract method abstract class HinhHocBài tập ví dụ 34Sơ đồ lớpBài tập ví dụ 35Lớp HinhHoc36public abstract class HinhHoc{ protected double s; //Định nghĩa các constructor //và property get, set tại đây ... public abstract void Nhap(); public abstract void TinhDienTich();}Lớp HinhTron37public class HinhTron: HinhHoc{ private double r; //Định nghĩa các constructor //và property get, set tại đây ... public override void Nhap() { //Định nghĩa phương thức ... } public override void TinhDienTich() { //Định nghĩa phương thức ... }}Lớp HinhChuNhat38public class HinhChuNhat:HinhHoc{ private double m; private double n; //Định nghĩa constructor //và property get, set tại đây ... public override void Nhap() { //Định nghĩa phương thức ... } public override void TinhDienTich() { //Định nghĩa phương thức ... }}Có 3 trường hợp cùng chung phương thức giữa lớp cơ sở và lớp dẫn xuất trong kế thừa:TH1: Chung hoàn toàn cách thức cài đặt Chỉ cài đặt phương thức này ở lớp cơ sởTH2: Chung một phần cách thức cài đặtLớp cơ sở (virtual) – Lớp dẫn xuất (override)TH3: Chỉ chung nguyên mẫu phương thức nhưng khác cách thức cài đặtLớp cơ sở (abstract) – Lớp dẫn xuất (override)!!! Trường hợp này lớp cơ sở chuyển sang lớp abstract Cú pháp phương thức chung39Thiết kế chương trình quản lý danh sách các hình học, gồm các loại hình sau:Hình chữ nhật: chiều ngang và chiều đứngHình tròn: bán kínhHình tam giác: chiều dài 3 cạnh a, b và cChức năng: cho phép nhập, xuất danh sách các hình trong một mảng một chiều. Cho biết số lượng và hình có diện tích lớn nhất của từng loạiBài tập40Từ khóa new với phương thức41Chúng ta có thể đặt từ khóa ‘new’ trước phương thứcÝ nghĩa: “Tôi là phương thức mới trong lớp dẫn xuất, hoàn toàn không có liên quan gì đến phương thức cùng tên trong lớp cơ sở” Từ khóa ‘new’ với phương thứcpublic class LandRover : Car{ public new void Move() { Console.WriteLine(“Move: LandRover (2.0 L engine)"); }}42Chú ý:Khi dùng ‘new’ với phương thức thì không thực hiện được tính đa hìnhChúng ta hiếm khi dùng từ khóa ‘new’ trong trường hợp nàyNếu muốn cài đặt một phương thức hoàn toàn mới không liên quan thì nên dùng tên khác Từ khóa ‘new’ với phương thức43Đa hình nghĩa là chúng ta có thể tạo các lớp dẫn xuất cài đặt cùng một phương thức như trong lớp cơ sở nhưng theo những cách khác nhauPhương thức trong lớp cơ sở được đánh dấu virtual cho phép lớp dẫn xuất dùng từ khóa override để cung cấp một cài đặt khácCác bước xây dựng tính đa hìnhĐIỂM CHÍNH44Lớp được đánh dấu abstractKhông thể dùng để tạo đối tượngPhương thức đánh dấu abstractKhông có cài đặtLớp dẫn xuất phải cài đặtTừ khóa ‘new’ đứng trước phương thức để báoĐây là phương thức mớiPhương thức này không liên quan đến phương thức cùng tên trong lớp cơ sởĐIỂM CHÍNH45
Các file đính kèm theo tài liệu này:
- lap_trinh_huong_doi_tuongchuong06_dahinh_4671.pptx