Bài giảng Lập trình hướng đối tượng Chương 6 Đa hình cung cấp cho người học các kiến thức Khái niệm Đa hình, các bước xây dựng chương trình có tính đa hình, từ khóa ‘base’, phương thức trừu tượng (abstract method), từ khóa ‘new’ với phương thức.
Trang 1Click to edit Master subtitle style
ĐA HÌNH
Khoa Công nghệ thông tin Trường Đại học Ngoại ngữ - Tin học, TP.HCM
CHƯƠNG 6:
Trang 2Khái niệm Đa hình
Các bước xây dựng chương trình có tính đa hình
Từ khóa ‘base’
Phương thức trừu tượng (abstract method)
NỘI DUNG
Trang 3Đó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ượng
Trang 4KHÁI NIỆM ĐA HÌNH
Trang 5Đa hình ( poly morphism)
poly = many morphism = forms
Đa hình là hiện tượng các đối tượng thuộc các lớ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ượng
Trang 6Khái niệm Đa hình
LandRover object
LandRover object
Ford object
Ford object
Honda object
Honda object
Move
LandRover dùng 2.0 L engine
để move
Ford dùng V engine để move
Honda dùng i-vtec để move
Trang 7Khá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
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 nhau
Trang 8Phâ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)
Trang 9Đa hình phương thức
Cá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
Trang 10Nhờ đặ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ới
Cài đặt lại phương thức đã được lớp cơ sở cung cấp
Trang 11CÁC BƯỚC XÂY DỰNG
TÍNH ĐA HÌNH
Trang 12Các bước xây dựng tính đa hình
Trang 13Lớp cơ sở : Lớp Car
Các bước xây dựng tính đa hình
public class Car {
public virtual void Move() {
Console.WriteLine("Car: Move");
} }
Trang 15Lớ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ình
Trang 16Để cài đặt lại phương thức
Tạo một hàm giống như lớp cơ sở (copy) Thêm từ khóa override trước phương thức
Các bước xây dựng tính đa hình
public class LandRover : Car
Trang 17Nế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ì
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ình
Trang 18Chú ý:
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ình
Trang 19Các bước xây dựng tính đa hình
public class Ford : Car
Console.WriteLine(“Move: Honda (i-vtec)"); }
}
Trang 20Lớp LandRover, Ford, Honda thừa kế từ lớp Car
nên có thể dùng như lớp Car
Các bước xây dựng tính đa hình
Car car1 = new Car ();
Car car2 = new LandRover ();
Car car3 = new Ford ();
Car car4 = new Honda ();
Trang 21Chúng ta có thể gọi phương thức Move() Tùy
được gọi
Gọi cùng phương thức (cùng signature) các
phương thức khác nhau được chạy
Các bước xây dựng tính đa hình
Move: Honda (i-vtec) Press any key to continue
Trang 22Từ 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ở
cập thành viên lớp cơ sở
Xem lại từ khóa ‘base’
Trang 23Khi 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ày
Xem lại từ khóa ‘base’
public override void Move()
{
base.Move();
Console.WriteLine("Move: LandRover (2.0 L engine)");
}
Trang 25PHƯƠNG THỨC TRỪU TƯỢNG
(ABSTRACT METHOD)
Trang 26Loại bỏ những thông tin cụ thể, giữ lại các thông tin chung
Mức độ trừu tượng hoá được thể hiện trên cây
kế thừa
Trừu tượng là gì?
Trang 27Mứ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ào
Ví 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ượng
Trang 28Khi 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ớp
• Thêm từ khóa abstract trước phương thức không cài đặt
Abstract method
abstract public class Car
{
Trang 29Lớp có chứa phương thức abstract thì bắt buộc phải
khai báo lớp đó là lớp abstract
Khi 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 method
Car car1 = new Car(); // error
Car car2 = new LandRover();
Car car3 = new Ford();
Car car4 = new Honda();
Trang 30Lớp trừu tượng có thể có các virtual method,
method thông thường khác
method, chúng ta vẫn dùng từ khóa ‘override’
override:
override cho virtual method
Abstract method
Trang 31Lớp HinhTron (hình tròn) gồm các thông tin:
Bán kính
Lớp HinhChuNhat(hình chữ nhật) gồm các
thông tin:
Chiều ngang Chiều đứng
Hã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ụ
Trang 32Xác định lớp và thông tin của lớp
Lớp HinhTron
Thuộ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)
Trang 33Áp dụng kỹ thuật kế thừa Xác định các điểm chung của các lớp
Trang 34Tạo lớp mới từ những điểm chung này
Trang 35Sơ đồ lớp
Bài tập ví dụ …
Trang 36public abstract void Nhap();
public abstract void TinhDienTich();
}
Trang 37//và property get, set tại đây
public override void Nhap()
Trang 38//và property get, set tại đây
public override void Nhap()
Trang 39Có 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 đặt
Lớ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 đặt
Lớ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 chung
Trang 40Thiế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 đứng
Hình tròn: bán kính
Hình tam giác: chiều dài 3 cạnh a, b và c
Chứ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ại
Bài tập
Trang 41TỪ KHÓA NEW VỚI PHƯƠNG THỨC
Trang 42Chú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
Từ khóa ‘new’ với phương thức
public class LandRover : Car {
{ Console.WriteLine(“Move: LandRover (2.0 L engine)");
} }
Trang 44Đ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 nhau
Phương thức trong lớp cơ sở được đánh dấu
ĐIỂM CHÍNH
Trang 45Lớp được đánh dấu abstract
Không thể dùng để tạo đối tượng Phương thức đánh dấu abstract
• Không có cài đặt
• Lớp dẫn xuất phải cài đặt
Đây là phương thức mới Phươ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ÍNH