Lớp trừu tượng và lớp bị khóa
¾Trong phương th Trong phương thức ảo (virtual method):
lớp dẫn xuất không nhất thiết phải đ i định
nghĩa lại phương th i phương thức ảo
¾Trong lớp trừu tư u tượng (abstract class): Để
bắt buộctất cảcác lớp dẫn xuất phải đ i định
nghĩa lại (override) phương th phương thức của lớp
cơs cơsởvàphương th phương thức đ c đó đư được gọi là
phương trừu tượng (abstract method)
OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com1 Lớp trừu tượng và Lớp bị khóa 1 Abstract class & Sealed class OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com2 Lớp trừu tượng ¾Trong phương thức ảo (virtual method): lớp dẫn xuất không nhất thiết phải định nghĩa lại phương thức ảo ¾Trong lớp trừu tượng (abstract class): Để bắt buộc tất cả các lớp dẫn xuất phải định nghĩa lại (override) phương thức của lớp cơ sở và phương thức đó được gọi là phương thức trừu tượng (abstract method) OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com3 Lớp trừu tượng ¾Lớp trừu tượng có từ khóa abstract trước từ class; VD: abstract class Tau { } ¾Trong phần thân của phương thức trừu tượng không có câu lệnh nào (chỉ xây dựng khuôn mẫu), tức là nó chỉ có phần khai báo. ¾Phương thức trừu tượng phải được đặt trong lớp trừu tượng OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com4 Phương thức trừu tượng ¾Không thể tạo ra đối tượng (new) từ lớp trừu tượng (abstract class) ¾Cú pháp phương thức trừu tượng: public abstract void TênPhươngThức( ); // hoặc abstract public void TênPhươngThức( ); OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: minh họa 5 ¾Ta xây dựng 3 class: 9Lớp Tau là lớp cơ sở 9Lớp TauChien và TauChoHang là lớp dẫn xuất từ lớp Tau class Tau { public virtual void LayThongtin() { Console.WriteLine(“Day la chiec Tau”); } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: 6 class TauChien:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: thể hiện tính đa hình 7 class Program { static void Main(string[] args) { Tau [ ] t = new Tau[3]; t[0] = new Tau(); t[1] = new TauChien(); t[2] = new TauChoHang(); for(int i=0; i<3; i++) t[i].LayThongTin(); } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: minh họa lớp trừu tượng 8 class Tau { public abstract void LayThongtin() { Console.WriteLine(“Day la chiec Tau”); } } class TauChien:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } // Error ? OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: minh họa 9 class TauChien:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } // Error ? abstract class Tau { public abstract void LayThongtin() { Console.WriteLine(“Day la chiec Tau”); } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: Sửa lại VD minh họa trên 10 abstract class Tau { public abstract void LayThongtin(); } class TauChien:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } // Error ? OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: thể hiện tính đa hình 11 class Program { static void Main(string[] args) { Tau [] t = new Tau[3]; t[0] = new Tau(); t[1] = new TauChien(); t[2] = new TauChoHang(); for(int i=0; i<3; i++) t[i].LayThongTin(); } } // Are there any error ? Which line do you get error ? OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com Sửa lại cho đúng 12 class Program { static void Main(string[] args) { Tau [] t = new Tau[3]; t[0] = new TauChien(); t[1] = new TauChien(); t[2] = new TauChoHang(); for(int i=0; i<3; i++) t[i].LayThongTin(); } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com Giả sử ta không xây dựng method LayThongTin trong lớp TauChien 13 abstract class Tau { abstract public void LayThongtin(); } class TauChien:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Chien ”); } } class TauChoHang:Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } // Error? OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: khác trang 57 trong giáo trình 14 abstract public class HinhHoc { abstract public double DienTich(); public virtual double ChuVi() { return 0 } ; } ¾Ta xây dựng 3 class: 9Lớp HinhHoc là lớp cơ sở 9Lớp HinhTron và HinhChuNhat là lớp dẫn xuất từ lớp HinhHoc OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: khác trang 57 trong giáo trình 15 class HinhTron : HinhHoc { double _bankinh; public double BanKinh { get { return _bankinh; } set { _bankinh = value; } } public override double DienTich() { return _bankinh*_bankinh*3.14 ; } public override double ChuVi() { return _bankinh*2*3.14 ; } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com Trang 57 trong giáo trình 16 Class HinhChuNhat : HinhHoc { double _dai, _rong; public double ChieuDai { get { return _dai; } set { _dai = value; } } public double ChieuRong { get { return _rong; } set { _rong = value; } } public override double DienTich() { return _dai*_rong; } public override double ChuVi() { return (_dai+_rong)*2; } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com Trang 58 trong giáo trình 17 static void Main(string[ ] args) { HinhHoc h; HinhTron t = new HinhTron(); t.BanKinh = 5; Console.WriteLine("\nTHONG TIN HINH TRON"); h = t; Console.WriteLine("Chu vi hinh tron: {0} ", h.ChuVi()); Console.WriteLine("Dien tich hinh tron:{0} \n", h.DienTich()); HinhChuNhat n = new HinhChuNhat(); n.ChieuDai = 4; n.ChieuRong = 3; h = n; Console.WriteLine("\nTHONG TIN HINH CHU NHAT"); Console.WriteLine("Chu vi hinh chu nhat:{0}", h.ChuVi() ); Console.WriteLine("Dien tich hinh chu nhat:{0}", h.DienTich() ); } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com18 Ghi chú: Phân biệt giữa từ khóa new và override ¾Từ khóa override dùng để định nghĩa lại (ghi đè) phương thức ảo (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. ¾Từ khóa new để che dấu thành viên của lớp cơ sở trùng tên với thành viên của lớp dẫn xuất. OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com19 Lớp cô lập (sealed class) ¾Lớp cô lập là lớp không cho các lớp khác kế thừa từ nó ¾Cú pháp: sealed class TênLớp { // Class members here. } ¾Việc sử dụng và tạo các đối tượng theo từ khóa new bình thường như các lớp khác. OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD 1: 20 Sealed class Tau { public void LayThongTin() { Console.WriteLine(“Day la tau chiec tau ”); } } class TauChoHang : Tau { public override void LayThongTin() { Console.WriteLine(“Day la tau Cho Hang”); } } // Error ? OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD 2 : sử dụng lớp cô lập 21 class Program { static void Main(string[ ] args) { SinhVien sv = new SinhVien(); sv.XemThongTin(); } } } // Error ? sealed class SinhVien { public void XemThongTin() { Console.WriteLine(“Day la sinh vien ”); } } OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com22 Lớp gốc: (Object class) ¾Tất cả các lớp của ngôn ngữ C# và tất cả các kiểu dữ liệu đều được dẫn xuất ngầm định từ lớp System.Object (Không cần phải khai báo kế thừa) ¾Lớp Object là lớp gốc trên cây phân cấp kế thừa, nó cung cấp một số phương thức mà các lớp con có thể ghi đè (override) như bảng sau: OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com Bảng tóm tắt phương thức của lớp Object 23 Phương thức Bổ từ truy cập Chức năng string ToString() public virtual Trả về một chuỗi mô tả của đối tượng int GetHashTable() public virtual Được sử dụng nếu thi hành từ điển bool Equals(object obj) public virtual So sánh các thực thể của đối tượng bool Equals(object objA, object objB) public static So sánh các thực thể của đối tượng bool ReferenceEquals(object objA, object objB) public static So sánh hai sự tham khảo đến một đối tượng Type GetType() public Trả về chi tiết kiểu của một đối tượng. object MemberwiseClone() protected tạo ra một bản copy của đối tượng void Finalize() protected virtual Đây là một dạng Destructor của .Net OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: minh họa lớp Object public class Xe { // biến thành viên private lưu giá trị private int _NhienLieu; public Xe(int nhienlieu) { _NhienLieu = nhienlieu; } // ghi đè phương thức ToString của lớp Object public override string ToString() { return _NhienLieu.ToString(); } } 24 OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com VD: minh họa lớp Object public class Tester { static void Main(string[ ] args) { int i = 5; Console.WriteLine(“Gia tri cua i la:: {0}”, i.ToString() ); Xe x = new Xe(7); Console.WriteLine(“Nhien lieu cua Xe la: {0}”, x.ToString() ); Console.WriteLine(“Gia tri cua 5 la: {0}”, 5.ToString() ); Console.ReadLine(); } } // Display? Trong lớp Object phương thức ToString() được khai báo? public virtual string ToString(); 25 OOP in C# - GV: Phạm Đình Sắc – sacvn@yahoo.com Q&A
File đính kèm:
- 05_Abstract_Sealed.pdf