Lập Trình C# - Thừa Kế và Đa Hình

Nội dung:
Giới thiệu: Thừa kế là cách tạo mới một lớp từ những lớp có sẵn. Tức là nó cho phép tái sử dụng lại mã nguồn đã viết trong lớp có sẵn. Thừa kế nói đơn giản là việc tạo một đối tượng khác B thừa hưởng tất cả các đặc tính của lớp A. Cách này gọi là đơn thừa kế. Nếu lớp B muốn có đặc tính của nhiều lớp A1, A2.... thì gọi là đa thừa kế. Đa thừa kế là khái niệm rất khó cài đặt cho các trình biên dịch. C# cũng như nhiều ngôn ngữ khác tìm cách tránh né khái niệm này.
Đ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.
Sự kế thừa
Trong C#, mối quan hệ chi tiết hoá là một kiểu kế thừa. Sự kế thừa không cho mang ý nghĩa chi tiết hoá mà còn mang ý nghĩa chung của tự nhiên về mối quan hệ này.
Khi ta nói rằng ListBox kế thừa từ Window có nghĩa là nó chi tiết hoá Window. Window được xem như là lớp cơ sở (base class) và ListBox được xem là lớp kế thừa (derived class). Lớp ListBox này nhận tất cả các đặc tính và hành vi của Window và chi tiết hoá nó bằng một số thuộc tính và phương thức của nó cần.
#Code:
using System;
public class Window
{
private int top,left;
public Window(int top,int left)
{
this.top=top;
this.left=left;
}
public void DrawWindow()
{
System.Console.WriteLine("Draw {0},{1}",top,left);
}
}
/*ListBox ke thua tu Window*/
public class ListBox : Window
{
private string current;
public ListBox(int top,int left,string current) : base(top,left)
{
this.current=current;
}
public new void DrawWindow()
{
base.DrawW();
System.Console.WriteLine("Writing listbox {0}",current);
}
}
public class Test
{
public static void Main()
{
Window w=new Window(5,10);
w.DrawWindow();
ListBox lb=new ListBox(20,30,"Xin Chao!");
lb.DrawWindow();
}

}
Đ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. Đa hình cũng là cách có thể dùng nhiều đạng của một kiểu mà không quan tâm đến chi tiết.
Tạo kiểu đa hình
ListBox và Button đều là một Window, ta muốn có một form để giữ tập hợp tất cả các thể hiện của Window của nó vẽ lên. Ngắn gọn, form này muốn quản lý mọi cư xử của tất cả các đối tượng đa hình của Window.
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ở.
public virtual void DrawWindow()
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.
#Code:
public override void DrawWindow()
{
base.DrawWindow();
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 đó.
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.
#Code:
public class ListBox : Window
{
public new virtual void Sort()
{
....
}

}
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 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
#Code:
using System;
abstract public class Window
{
protected int top,left;
public Window(int top,int left)
{
this.top=top;
this.left=left;
}
abstract public void DrawWindow();
}
public class ListBox : Window
{
private string contents;
public ListBox(int top,int left,string contents) : base(top,left)
{
this.contents=contents;
}
public override void DrawWindow()
{
Console.WriteLine("Writing....: {0}",contents);
}
}
public class Button : Window
{
public Button(int top,int left) : base(top,left){}
public override void DrawWindow()
{
Console.WriteLine("Draw... {0},{1}",top,left);
}
}
public class Test
{
static void Main()
{
Window[] arr=new Window[3];
arr[0]=new ListBox(1,2,"First");
arr[1]=new ListBox(3,4,"Second");
arr[2]=new ListBox(5,6);
for(int i=0;i<3;i++)
{
arr[i].DrawWindow();
}
}

}

0 Comment:

Đăng nhận xét

Thank you for your comments!