Bài giảng Lập trình hướng đối tượng: Đa hình do Lê Viết Mẫn biên soạn cung cấp cho người học các kiến thức: Nhắc lại về thừa kế, đa hình, lớp cơ sở trừu tượng, một số vấn đề khác. Mời các bạn cùng tham khảo nội dung chi tiết.
Đa hình v 2.3 - 09/2018 Lê Viết Mẫn - lvman@hce.edu.vn Đa hình bạn cài đặt mơ hình Lê Viết Mẫn - lvman@hce.edu.vn C# Đa hình học Vehicle move() Vehicle veh [ ] = { Train(“TGV”), Car(“twingo”), Ship(“Titanic”) }; Train for (int i = 0; i < 3; i++) { veh[ i ].move(); } move() move() { on the road } { on rails } Lê Viết Mẫn - lvman@hce.edu.vn Car Ship move() { on water } Đa hình Nội dung Nhắc lại thừa kế Đa hình Lớp sở trừu tượng Một số vấn đề khác Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Nhắc lại thừa kế Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Thừa kế • • Là khả lớp thừa kế từ lớp cha tất thành phần liệu, thuộc tính hàm thành phần lớp cha • Ngoại trừ: cấu tử, hủy tử, toán tử = Cú pháp: class Student : HCEPerson { // Khai báo lớp Student } • • Khai báo định nghĩa lớp sở bình thường Tốn tử truy xuất • • private : cho phép truy xuất bên lớp, KHÔNG bao gồm lớp protected : cho phép truy xuất bên lớp từ lớp Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Lớp Trong phần định nghĩa cấu tử • Chứa lời gọi đến cấu tử lớp cha (lớp sở) HCEPerson.cs Student.cs • Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Lớp • Có thể định nghĩa lại hàm thành phần lớp cha HCEPerson.cs Student.cs Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Sử dụng HCEPerson binh = new HCEPerson(901289, "Hoang Van Binh", "1 Le Loi"); Student an = new Student(971232, "Nguyen Van An", "100 Phung Hung", 43, 2); binh.displayProfile(); Program.cs binh = an; // chuyển đổi kiểu ngầm định, ngược lại phải viết tường minh binh.displayProfile(); Class c1 = new Class(“HTTT4253”); // trình biên dịch báo lỗi, khơng tồn hàm addClassTaken() lớp HCEPerson binh.addClassTaken(c1); [Name : Hoang Van Binh; ID : 901289; Address : Le Loi] [Name : Nguyen Van An; ID : 971232; Address : 100 Phung Hung] • • Kiểu khai báo kiểu thời Điều khơng hợp lý • • Bởi khơng phù hợp với kiểu thời mà nhận Giải pháp cho điều tạo kỹ thuật đa hình Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Đa hình Lê Viết Mẫn - lvman@hce.edu.vn 10 Đa hình Circle.cs Shape.cs Ví dụ Lê Viết Mẫn - lvman@hce.edu.vn 21 Đa hình Cấu tử lớp trừu tượng • • Có ý nghĩa khơng định nghĩa cấu tử ? • Đúng ! Bạn nên tạo cấu tử để khởi tạo thành phần liệu nó, chúng thừa kế lớp Vì lớp không khởi tạo ! Lê Viết Mẫn - lvman@hce.edu.vn 22 Đa hình Một số vấn đề khác Lê Viết Mẫn - lvman@hce.edu.vn 23 Đa hình Kỹ thuật che phủ (shadowing) • • Kỹ thuật đối lập mặt logic với chồng hàm Khi lớp định nghĩa thành phần trùng lặp với thành phần lớp cha, lớp che phủ phiên lớp cha • Hữu ích bạn thừa kế từ lớp mà bạn khơng tạo • Vd : Bạn nhận lớp Circle từ người khác bạn có lớp ThreeDCircle mà bạn cho thừa kế từ lớp Circle Vấn đề lớp ThreeDCircle định nghĩa hàm Draw trùng tên với hàm thành phần Circle • • • • Giải pháp dùng từ khoá override new cho hàm Draw (của lớp ThreeDCircle) Nhưng muốn dùng override phải có khả sửa hàm Draw lớp Circle thành virtual Từ khoá new cho phép bỏ qua phiên cài đặt lớp sở • Có thể áp dụng từ khố new cho thành phần nào: biến thành phần, hằng, biến thành phần tĩnh, thuộc tính, hàm thành phần Bạn truy xuất phiên cài đặt lớp cha chuyển đổi ThreeDCircle o = new ThreeDCircle(); kiểu tường minh ((Circle)o).Draw(); Lê Viết Mẫn - lvman@hce.edu.vn 24 Đa hình Luật chuyển đổi kiểu • • Nhắc lại : • • Chuyển đổi ngầm định : gán đối tượng lớp cho biến lớp cha Ngược lại chuyển đổi tường minh System.Object lớp sở cao hệ thống kiểu liệu tảng NET • • • Mọi thứ thừa kế từ Object object frank = new Hexagon(“frank”); Có thể chứa đối tượng kiểu biến kiểu object Một biến kiểu lớp sở chứa đối tượng lớp phái sinh • Lợi ích (Xem ứng dụng thứ slide 15) Lê Viết Mẫn - lvman@hce.edu.vn 25 Shape frank = new Hexagon(“frank”); Circle jill = new ThreeDCircle(“jill”); Đa hình Từ khố as is object frank = new Manager(“frank”); // lỗi thời gian chạy Hexagon hex = (Hexagon)frank; // chuyển đổi tường minh • • • Chuyển đổi tường minh thực thời gian chạy • Nên chạy, chương trình phát sinh lỗi Từ khố as cho phép ép kiểu không trả giá trị null Hexagon hex = frank as Hexagon; if (hex == null) // thực điều Từ khoá is cho phép kiểm tra đối tượng thuộc lớp • Trả giá trị true, false Lê Viết Mẫn - lvman@hce.edu.vn static void Draw(Shape s) { if (s is Hexagon) // thực thao tác với Hexagon if (s is Circle) // thực thao tác với Circle } 26 Đa hình System.Object • • Trong NET, kiểu liệu thừa kế từ lớp System.Object • • Kể kiểu liệu mà bạn định nghĩa Khi lớp tạo mà khơng xác định rõ lớp sở, trình biên dịch tự động cho phái sinh từ System.Object System.Object định nghĩa tập thành phần chung cho kiểu : public class Object { //virtual members public virtual bool Equals(object obj); public virtual void Finalize(); public virtual int GetHashCode(); public virtual string ToString(); //instance-level, non-virtual members public Type GetType(); protected object MemberwiseClone(); //static members public static bool Equals(object objA, object objB); public static bool ReferenceEquals(object objA, object objB); } Lê Viết Mẫn - lvman@hce.edu.vn 27 Đa hình System.Object Equals() Thực so sánh tham chiếu đối tượng Nếu hai biến tham chiếu đến đối tượng trả kết true, ngược lại false Thường nạp chồng để thực so sánh giá trị nội đối tượng Khi nạp chồng hàm này, bạn nên nạp chồng hàm GetHashCode() GetHashCode() Hàm trả số nguyên (int) thể cho đối tượng định ToString() Hàm trả thể chuỗi đối tượng GetType() Hàm trả đối tượng kiểu Type mô tả đối tượng mà bạn tham chiếu MemberwiseClone() Hàm trả chép thành phần đối tượng, sử dụng chép (clone) đối tượng Equals Hàm tĩnh, so sánh thành phần liệu hai đối tượng (object, object) ReferenceEquals Hàm tĩnh, so sánh hai đối tượng có tham chiếu (object, object) Lê Viết Mẫn - lvman@hce.edu.vn 28 Đa hình Ví dụ class Person { } class Program { static void Main() { Person p1 = new Person(); Console.WriteLine(p1.ToString()); Console.WriteLine(p1.GetHashCode()); Console.WriteLine(p1.GetType()); } } Person p2 = p1; object o = p2; if (o.Equals(p1) && p2.Equals(o)) Console.WriteLine(“Same instance !”); Lê Viết Mẫn - lvman@hce.edu.vn 29 Đa hình Nạp chồng ToString() • Có thể nạp chồng hàm để trả chuỗi thể nội dung biến thành phần • Hữu ích cho gỡ rối (debug) class Person { public string FirstName { get; set; } public string LastName { get; set; } public Person() { } public Person(string fName, string lName) { FirstName = fName; LastName = lName; } public override string ToString() { return string.Format(“[FirstName:{0}; LastName:{1}]”, FirstName, LastName); } } Lê Viết Mẫn - lvman@hce.edu.vn 30 Đa hình Nạp chồng Equals() class Person { public override bool Equals(object obj) { //kiểm tra obj có phải kiểu Person ? if (obj is Person && obj != null) { Person temp = (Person)obj; //so sánh cho thành phần liệu if (temp.FirstName.Equals(this.FirstName) && temp.LastName.Equals(this.LastName)) return true; else return false; } return false; } } Lê Viết Mẫn - lvman@hce.edu.vn 31 Đa hình Nạp chồng Equals() • Nếu có nạp chồng hàm ToString() class Person { public override bool Equals(object obj) { //không cần kiểm tra hay chuyển đổi kiểu return obj.ToString().Equals(this.ToString()); } } Lê Viết Mẫn - lvman@hce.edu.vn 32 Đa hình Nạp chồng GetHashCode() • Khi nạp chồng hàm Equals() bạn phải nạp chồng hàm GetHashCode() • Mã băm (hash) giá trị số thể đối tượng tình trạng cụ thể • • Hai đối tượng chứa chuỗi Hello có mã băm giống ngược lại Mặc định, hàm sử dụng vị trí đối tượng nhớ để làm mã băm • Nếu bạn tạo kiểu dự định lưu trữ Hashtable, bạn nên nạp chồng hàm • Nên lấy mã băm từ thành phần liệu • Ví dụ : ID, số bảo hiểm xã hội Lê Viết Mẫn - lvman@hce.edu.vn 33 Đa hình Nạp chồng GetHashCode() class Person { public override int GetHashCode() { return SSN.GetHashCode(); } } class Person { public override int GetHashCode() { return this.ToString().GetHashCode(); } } Lê Viết Mẫn - lvman@hce.edu.vn 34 Đa hình Cảm ơn ý Câu hỏi ? Lê Viết Mẫn - lvman@hce.edu.vn 35 Đa hình ... điều tạo kỹ thuật đa hình Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Đa hình Lê Viết Mẫn - lvman@hce.edu.vn 10 Đa hình Đa hình • Khả kiểu liệu A xem sử dụng kiểu liệu B • Ví dụ: đối tượng kiểu Student... on water } Đa hình Nội dung Nhắc lại thừa kế Đa hình Lớp sở trừu tượng Một số vấn đề khác Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Nhắc lại thừa kế Lê Viết Mẫn - lvman@hce.edu.vn Đa hình Thừa kế... tượng Lê Viết Mẫn - lvman@hce.edu.vn 19 Đa hình Ví dụ Lê Viết Mẫn - lvman@hce.edu.vn 20 Đa hình Circle.cs Shape.cs Ví dụ Lê Viết Mẫn - lvman@hce.edu.vn 21 Đa hình Cấu tử lớp trừu tượng • • Có ý nghĩa