Xem mẫu

  1. CHƯƠNG 5 THỪA KẾ VÀ ĐA HÌNH
  2. Nội dung chính  Thừa kế là gì?  Cài đặt thừa kế  Đa hình
  3. 1. Thừa kế là gì?  C# cho phép tạo ra một lớp mới từ các lớp đã tồn tại.  Lớp B kế thừa lớp A, có nghĩa là lớp B sẽ có các thuộc tính và phương thức của A, ngoại trừ các thành phần private. – Lớp B được gọi là lớp con hay lớp dẫn xuất. – Lớp A được gọi là lớp cha hay lớp cơ sở.
  4. Một số kiểu thừa kế
  5. Một số kiểu thừa kế
  6. Một số kiểu thừa kế
  7. 2. Cài đặt thừa kế Cú pháp khai báo lớp dẫn xuất từ một lớp cơ sở như sau: Cú pháp định nghĩa lớp dẫn xuất: class TênLớpCon : TênLớpCơSở { // Thân lớp dẫn xuất }
  8. Ví dụ 1 using System; class PointApp //Lop co so Point2D { class Point2D public static void Main() { { public int x,y; Point2D p2 = new Point2D(); public void Xuat2D() p2.x = 1; { p2.y = 2; Console.WriteLine("({0}, {1})", x, y); p2.Xuat2D(); } Point3D p3 = new Point3D(); } p3.x = 4; p3.y = 5; //Lop dan xuat Point3D ke thua tu lop Point2D class Point3D:Point2D p3.z = 6; { p3.Xuat3D(); public int z; p3.Xuat2D(); public void Xuat3D() Console.ReadLine(); { Console.WriteLine("({0}, {1}, {2})", x, y, z); } } } }
  9. Ví dụ 2 using System; public void Xuat2D() { //Lop co so Console.Write("({0}, {1})", x, y); class Point2D } { } public int x,y; //phuong thuc tao lap cua lop co so co tham so public Point2D(int a, int b) { x = a; y = b; }
  10. Ví dụ 2 (tt) //Lop dan xuat class Point3D:Point2D class PointApp { { public int z; //Vi phuong thuc tao lap cua lop co so co tham so nen public static void Main() //phuong thuc tao lap cua lop dan xuat cung phai co tham so { public Point3D(int a, int b, int c):base (a,b) Point2D p2 = new Point2D(1, 2); { Console.Write("Toa do cua diem 2 D z = c; :"); } p2.Xuat2D(); public void Xuat3D() Console.WriteLine(); { Point3D p3 = new Point3D(4,5,6); Console.Write("({0}, {1}, {2})", x, y, z); Console.Write("Toa do cua diem 3 D } :"); p3.Xuat3D(); } Console.ReadLine(); } }
  11. 3. Đa hình  Đa hình là việc lớp B thừa kế các đặc tính từ lớp A nhưng có thêm một số cài đặt riêng.  Đahình cũng là cách có thể dùng nhiều dạng của một kiểu mà không quan tâm đến chi tiết.
  12. Tạ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( )
  13. Tạ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 đó.
  14. Tạo phiên bản với từ khoá new và override  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 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( ) {...}
  15. Lớp trừu tượng  Phương thức trừu tượng là phương thức chỉ có tên thôi và 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( );
  16. Ví 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.
  17. Ví dụ 1 // lop hinh hoc (truu tuong) // lop hinh tron ke thua tu lop hinh hoc public class HinhTron : HinhHoc abstract public class HinhHoc { { double _bankinh; public double BanKinh abstract public double DienTich(); { virtual public double ChuVi() get{ return _bankinh;} set{ _bankinh = value;} { } return 0; public override double DienTich() { } return _bankinh*_bankinh*3.1416; } } public override double ChuVi() { return _bankinh*2*3.1416; } }
  18. Ví dụ 1(tt) // lop hinh chu nhat ke thua tu lop hinh hoc class Tester public class HinhChuNhat : HinhHoc { static void Main(string[] args) { { double _dai, _rong; HinhHoc h; public double ChieuDai HinhTron t = new HinhTron(); { t.BanKinh = 5; get{ return _dai;} Console.WriteLine("Thong tin ve hinh tron"); set{ _dai = value;} h = t; } Console.WriteLine("Chu vi hinh tron: {0} ", public double ChieuRong h.ChuVi()); { Console.WriteLine("Dien tich hinh tron:{0} ", get{ return _rong;} h.DienTich()); set{ _rong = value;} HinhChuNhat n = new HinhChuNhat(); } n.ChieuDai = 4; public override double DienTich() n.ChieuRong = 3; { h = n; return _dai*_rong; Console.WriteLine("Thong tin ve hinh chu } nhat "); public override double ChuVi() Console.WriteLine("Chu vi hinh chu nhat: { {0}", return (_dai+_rong)*2; h.ChuVi()); Console.WriteLine("Dien tich hinh chu nhat: {0}", } h.DienTich()); } Console.ReadLine(); } }
  19. Ví dụ 2 Minh hoạ phương thức và lớp trừu tượng // ListBox derives from Window public class ListBox : Window using System; { // constructor adds a parameter abstract public class Window public ListBox(int top, int left, string { contents): // constructor takes two integers to base(top, left) // fix location on the console // call base constructor public Window(int top, int left) { { listBoxContents = contents; this.top = top; } this.left = left; // an overridden version implementing the } // abstract method // simulates drawing the window public override void DrawWindow( ) // notice: no implementation { Console.WriteLine("Writing string to the abstract public void DrawWindow( ); listbox: {0}“, listBoxContents); // these members are private and thus invisible } // to derived class methods. We'll examine this private string listBoxContents; // later in the chapter // new member variable protected int top; } protected int left; }
  20. Ví dụ 2 (tt) public class Button : Window public class Tester { { static void Main( ) { public Button(int top, int left): base(top, Window[] winArray = new Window[3]; left) 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++) { // implement the abstract method winArray[i].DrawWindow( ); public override void DrawWindow( ) } } { } Console.WriteLine("Drawing a button at {0}, {1}\n", top, left); } }
nguon tai.lieu . vn