Mục tiêu chính trong Bài giảng Lập trình hướng đối tượng trong C # Chương 5 Thiết kế và đa hình nhằm trình bày về thừa kế là gì? cài đặt thừa kế, nêu khái niệm đa hình.
Trang 1CHƯƠNG 5
THỪA KẾ VÀ ĐA HÌNH
Trang 2Nội dung chính
Trang 31 Thừa kế là gì?
phương thức của A, ngoại trừ các thành phần private
Trang 4Một số kiểu thừa kế
Trang 8public int x,y;
public void Xuat2D()
public static void Main() {
Point2D p2 = new Point2D(); p2.x = 1;
Trang 9public int x,y;
//phuong thuc tao lap cua lop co so co tham so
public Point2D(int a, int b)
}
Trang 10//Vi phuong thuc tao lap cua lop co so co tham so nen
//phuong thuc tao lap cua lop dan xuat cung phai co tham so
public Point3D(int a, int b, int c):base (a,b)
public static void Main() {
Point2D p2 = new Point2D(1, 2); Console.Write("Toa do cua diem 2
Trang 113 Đa hình
lớp A nhưng có thêm một số cài đặt riêng
của một kiểu mà không quan tâm đến chi tiết.
Trang 12Tạo phương thức đa hình
Tạo phương thức đa hình , ta cần đặt từ khoá virtual
trong phương thức của lớp cơ sở
Ví dụ:
public virtual void DrawWindow( )
Trang 13Tạo phương thức đa hình
Trong lớp kế thừa để nạp chồng lại mã nguồn của lớp cơ sở ta dùng từ khoá
override khi khai báo phương thức và nội dung bên trong viết bình thường
Ví dụ về nạp chồng phương thức DrawWindow:
public override void DrawWindow( )
{
base.DrawWindow( ); // gọi phương thức của lớp co sở
Console.WriteLine ("Writing string to the listbox: {0}“, listBoxContents);
}
Dùng hình thức đa hình phương thức này thì tuỳ kiểu khai báo của đối tượng nào thì nó dùng phương thức của lớp đó.
Trang 14Tạo phiên bản với từ khoá new và override
trong lớp cơ sở nhưng ta không muốn nạp chồng lại phương thức virtual trong lớp cơ sở ta dùng từ khoá new
đánh dấu trước khi từ khoá virtual trong lớp kế thừa.
public class ListBox : Window
{
public new virtual void Sort( ) { }
Trang 15Lớp trừu tượng
nó phải được cài đặt lại ở tất các các lớp kế thừa Lớp trừu tượng chỉ thiết lập một cơ sở cho các lớp kế thừa mà nó không thể có bất kỳ một thể hiện nào tồn tại.
Cú pháp khai báo phương thức trừu tượng:
abstract public void TênPhươngThức( );
Trang 16Ví dụ
Xây dựng lớp HinhHoc với phương thức tính chu vi,
diện tích là phương thức trừu tượng hoặc phương
thức ảo.
Sau đó định nghĩa các lớp HinhChuNhat (hình chữ nhật), HinhTron (hình tròn) kế thừa từ lớp HinhHọc
với các thành phần dữ liệu và phương thức tính chu
vi, diện tích cụ thể của từng loại đối tượng.
Trang 17Ví dụ 1
// lop hinh hoc (truu tuong)
abstract public class HinhHoc
{
abstract public double DienTich();
virtual public double ChuVi()
{
return 0;
}
}
// lop hinh tron ke thua tu lop hinh hoc
public class HinhTron : HinhHoc {
double _bankinh;
public double BanKinh {
get{ return _bankinh;}
set{ _bankinh = value;}
}
public override double DienTich() {
return _bankinh*_bankinh*3.1416; }
public override double ChuVi() {
return _bankinh*2*3.1416;
}
}
Trang 18Ví dụ 1(tt)
// lop hinh chu nhat ke thua tu lop hinh hoc
public class HinhChuNhat : HinhHoc
{
double _dai, _rong;
public double ChieuDai
{
get{ return _dai;}
set{ _dai = value;}
}
public double ChieuRong
{
get{ return _rong;}
set{ _rong = value;}
static void Main(string[] args) {
Trang 19// constructor takes two integers to
// fix location on the console
public Window(int top, int left)
abstract public void DrawWindow( );
// these members are private and thus invisible
// to derived class methods We'll examine this
// later in the chapter
protected int top;
protected int left;
}
// ListBox derives from Window public class ListBox : Window {
// constructor adds a parameter public ListBox(int top, int left, string contents):
base(top, left) // call base constructor {
listBoxContents = contents;
} // an overridden version implementing the // abstract method
public override void DrawWindow( ) {
Console.WriteLine("Writing string to the listbox: {0}“, listBoxContents);
} private string listBoxContents;
// new member variable
}
Trang 20// implement the abstract method
public override void DrawWindow( )
Window[] winArray = new Window[3];
winArray[0] = new ListBox(1,2,"First List Box"); winArray[1] = new ListBox(3,4,"Second List Box"); winArray[2] = new Button(5,6);
for (int i = 0;i < 3; i++) {
winArray[i].DrawWindow( );
} } }
Trang 21Chú ý
Phân biệt giữa từ khóa new và override
(virtual) hoặc phương thức trừu tượng (abstract) của lớp cơ sở,
nó được dùng với mục đích đa hình.
thành viên của lớp dẫn xuất
– Khi cần viết lại một phương thức trong lớp kế thừa mà đã có trong lớp cơ sở, nhưng ta không muốn nạp chồng lại phương thức
khoá virtual trong lớp kế thừa.
Trang 22Giới hạn của lớp trừu tượng
Ví dụ trên, phương thức trừu tượng DrawWindow() của lớp trừu tượng Window được lớp ListBox kế
thừa
Như vậy, các lớp sau này kế thừa từ lớp ListBox đều phải thực hiện lại phương thức DrawWindow(), đây
là điểm giới hạn của lớp trừu tượng
Hơn nữa, như thế sau này không bao giờ ta tạo
được lớp Window đúng nghĩa Do vậy, nên chuyển
lớp trừu tượng thành giao diện trừu tượng.