Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
1,88 MB
Nội dung
Ngơn Ngữ Lập Trình C# { Console.WriteLine(“This year: {0}”, RightNow.Year.ToString()); RightNow.Year = 2003; Console.WriteLine(“This year: {0}”, RightNow.Year.ToString()); } } Kết quả: This year: 2002 This year: 2003 Đoạn chương trình hoạt động tốt, nhiên có thay đổi giá trị biến thành viên Như ta thấy, biến thành Year thay đổi đến 2003 Điều thực không mong muốn Chúng ta muốn đánh dấu thuộc tính tĩnh khơng thay đổi Nhưng khai báo khơng biến tĩnh khơng khởi tạo phương thức khởi dựng static thi hành Do C# cung cấp thêm từ khóa readonly phục vụ xác cho mục đich Với ví dụ ta có cách khai báo lại sau: public static readonly int Year; public static readonly int Month; public static readonly int Date; public static readonly int Hour; public static readonly int Minute; public static readonly int Second; Khi ta phải bỏ lệnh gán biến thành viên Year, khơng bị báo lỗi: // RightNow.Year = 2003; // error Chương trình sau biên dịch thực mục đích Câu hỏi trả lời Câu hỏi 1: Có phải nên sử dụng lớp với liệu thành viên? Trả lời 1: Nói chung không nên sử dụng lớp với liệu thành viên Ý nghĩa môt lớp hay lập trình hướng đối tượng khả đóng gói chức liệu vào gói đơn Câu hỏi 2: Có phải tất liệu thành viên luôn khai báo public để bên ngồi truy cập chúng? 121 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# Trả lời 2: Nói chung khơng Do vấn đề che dấu liệu lập trình hướng đối tượng, xu hướng liệu bên nên dùng cho phương thức thành viên Tuy nhiên, biết khái niệm thuộc tính cho phép biến thành viên truy cập từ bên ngồi thơng qua hình thức phương thức Câu hỏi 3: Có phải có nhiều lớp xây dựng sẵn tơi tìm chúng đâu? Trả lời 3: Microsoft cung cấp nhiều lớp gọi lớp sở NET Những lớp tổ chức bên namespace Chúng ta tìm tài liệu lớp thư viện trực tuyến Microsoft Và số lớp thường sử dụng trình bày ví dụ giáo trình Câu hỏi 4: Sự khác tham số (parameter) đối mục (argument)? Trả lời 4: Tham số định nghĩa thứ truyền vào phương thức Một tham số xuất với định nghĩa phương thức đầu phương thức Một đối mục giá trị truyền vào phương thức Chúng ta truyền đối mục vào phương thức phù hợp với tham số khai báo phương thức Câu hỏi 5: Chúng ta tạo phương thức bên ngồi lớp hay khơng? Trả lời 5: Mặc dù ngôn ngữ khác, tạo phương thức bên ngồi lớp Nhưng C# khơng, C# hướng đối tượng, tất mã nguồn phải đặt bên lớp Câu hỏi 6: Có phải phương thức lớp C# hoạt động tương tự ngôn ngữ khác C++ hay Java? Trả lời 6: Trong hầu hết phần chúng tương tự Tuy nhiên, ngôn ngữ có khác biệt riêng Một ví dụ khác C# không cho phép tham số mặc định bên phương thức Trong ngơn ngữ C++ khai báo tham số mặc định lúc định nghĩa phương thức gọi phương thức khơng cần truyền giá trị vào, phương thức dùng giá trị mặc định Trong C# khơng phép Nói chung cịn nhiều khác nữa, xin dành cho bạn đọc tự tìm hiểu Câu hỏi 7: Phương thức tĩnh truy cập thành viên không truy cập thành viên lớp? Trả lời 7: Phương thức tĩnh truy cập thành viên tĩnh lớp Câu hỏi thêm Câu hỏi 1: Sự khác thành viên khai báo public thành viên không khai báo public? Câu hỏi 2: Từ khoá sử dụng việc thực thi thuộc tính lớp? Câu hỏi 3: Những kiểu liệu trả từ phương thức? Câu hỏi 4: Sự khác truyền biến tham chiếu truyền biến tham trị vào phương thức? Câu hỏi 5: Làm truyền tham chiếu với biến kiểu giá trị vào phương thức? 122 Xây Dựng Lớp - Đối Tượng Ngôn Ngữ Lập Trình C# Câu hỏi 6: Khi phương thức khởi dựng gọi? Câu hỏi 7: Phương thức khởi dựng tĩnh gọi nào? Câu hỏi 8: Có thể truyền biến chưa khởi tạo vào hàm không? Câu hỏi 9: Sự khác lớp đối tượng lớp? Câu hỏi 10: Thành viên lớp truy cập mà tạo thể lớp? Câu hỏi 11: Lớp mà xây dựng thuộc kiểu liệu nào? Câu hỏi 12: Từ khóa this dùng làm lớp? Bài tập Bài tập 1: Xây dựng lớp đường trịn lưu giữ bán kính tâm đường tròn Tạo phương thức để tính chu vi, diện tích đường trịn Bài tập 2: Thêm thuộc tính BanKinh vào lớp tạo từ tập Bài tập 3: Tạo lớp lưu trữ giá trị nguyên tên myNumber Tạo thuộc tính cho thành viên Khi số lưu trữ nhân cho 100 Và số truy cập chia cho 100 Bài tập 4: Chương trình sau có lỗi Hãy sửa lỗi chương trình biên dịch chương trình Dịng lệnh gây lỗi? using System; using System.Console; class VD1 { public string first; } class Tester { public static void Main() { VD1 vd = new VD1(); Write(“Nhap vao mot chuoi: ”); vd.first = ReadLine(); Write(“Chuoi nhap vao: {0}”, vd.first); } } Bài tập 5: Chương trình sau có lỗi Hãy sửa lỗi chương trình biên dịch chương trình Dịng lệnh gây lỗi? 123 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# class Class1 { public static void GetNumber(ref int x, ref int y) { x = 5; y = 10; } public static void Main() { int a = 0, b = 0; GetNumber(a, b); System.Console.WriteLine(“a = {0} \nb = {1}”, a, b); } } Câu hỏi 6: Chương trình sau có lỗi Hãy sửa lỗi cho biết lệnh phát sinh lỗi? Class Tester { public static void Main() { Display(); } public static void Display() { System.Console.WriteLine(“Hello!”); return 0; } } Câu hỏi 7: Viết lớp giải phương trình bậc hai Lớp có thuộc tính a, b, c nghiệm x1, x2 Hãy xây dựng theo hướng đối tượng lớp Lớp cho phép bên xem nghiệm phương trình cho phép thiết lập hay xem giá trị a, b, c 124 Xây Dựng Lớp - Đối Tượng Ngơn Ngữ Lập Trình C# Chương KẾ THỪA – ĐA HÌNH Đặc biệt hóa tổng qt hóa Sự kế thừa Thực thi kế thừa Gọi phương thức khởi dựng lớp sở Gọi phương thức lớp sở Điều khiển truy xuất Đa hình Kiểu đa hình Phương thức đa hình Từ khóa new override Lớp trừu tượng Gốc tất lớp - lớp Object Boxing Unboxing liệu Boxing thực ngầm định Unboxing phải thực tường minh Các lớp lồng Câu hỏi & tập Trong chương trước trình bày cách tạo kiểu liệu việc xây dựng lớp đối tượng Tiếp theo chương đưa sâu vào mối quan hệ đối tượng giới thực cách mơ hình hóa quan hệ xây dựng chương trình Chương giới thiệu khái niệm đặc biệt hóa (specialization) cài đặt ngơn ngữ C# thông qua kế thừa (inheritance) 125 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# Khái niệm đa hình (polymorphism) trình bày chương 5, khái niệm quan trọng lập trình hướng đối tượng Khái niệm cho phép thể lớp có liên hệ với xử lý theo cách tổng quát Cuối phần trình bày lớp lập (sealed class) khơng đặt biệt hóa, hay lớp trừu tượng sử dụng đặc biệt hóa Lớp đối tượng Object gốc tất lớp thảo luận phần cuối chương Đặc biệt hóa tổng quát hóa Lớp thể lớp tức đối tượng không tồn khối, chúng tồn mạng lưới phụ thuộc quan hệ lẫn Ví dụ người xã hội động vật sống giới có quan hệ lồi với Quan hệ (is-a) đặc biệt hóa Khi nói mèo loại động vật có vú, có nghĩa nói mèo trường hợp đặc biệt loại động vật có vú Nó có tất đặc tính động vật có vú (như sinh con, có sữa mẹ có lơng ) Tuy nhiên, mèo có thêm đặc tính riêng xác định họ nhà mèo mà họ động vật có vú khác khơng có Chó loại động vật có vú, chó có tất thuộc tính động vật có vú, riêng cịn có thêm thuộc tính riêng xác định họ lồi chó mà khác với thuộc tính đặc biệt lồi khác ví dụ mèo chẳng hạn Quan hệ đặc biệt hóa tổng quát hóa hai mối quan hệ đối ngẫu phân cấp với Chúng có quan hệ đối ngẫu đặc biệt xem mặt ngược lại tổng quát Do đó, lồi chó mèo trường hợp đặc biệt động vật có vú Ngược lại động vật có vú trường hợp tổng qt từ lồi chó mèo Mối quan hệ phân cấp tạo quan hệ, trường hợp đặc biệt nhánh trường hợp tổng quát Trong phân cấp di chuyển lên ta trường hợp tổng quát hóa, ngược lại di chuyển xuống ngược nhánh ta trường hợp đặc biệt hóa Ta có sơ đồ phân cấp minh họa cho lồi chó, mèo động vật có vú trên: ĐỘNG VẬT CĨ VÚ MÈO CHĨ 126 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# Tương tự, nói ListBox Button Window, ta phải đặc tính hành vi Window có hai lớp Hay nói cách khác, Window tổng qt hóa chia xẻ thuộc tính hai lớp ListBox Button, trường hợp đặc biệt ListBox Button có riêng thuộc tính hành vi đặc thù khác Ngơn ngữ mơ hình hóa thống (UML) UML ( Unified Modeling Language) ngơn ngữ chuẩn hóa để mơ tả cho hệ thống thương mại Trong chương sử dụng số phần mơ hình UML để trình bày biểu đồ quan hệ lớp Trong UML, lớp thể khối hộp, tên lớp đặt khối hộp, phương thức hay biến thành viên đặt bên hộp Như hình 5.1, mơ hình quan hệ tổng qt hóa đặc biệt hóa trình bày qua UML, ghi mũi tên từ lớp đặc biệt hóa đến lớp tổng qt hóa Window Button List Box Hình 5.2: Quan hệ thành phần cửa sổ Thông thường lưu ý hai lớp chia xẻ chức với nhau, chúng trích phần chung đưa vào lớp sở chia xẻ Điều có lợi, cung cấp khả cao để sử dụng lại mã nguồn chung dễ dàng trì mã nguồn Window Kế Thừa – Đa Hình 127 Radio Button Check Box Command List Box Ngôn Ngữ Lập Trình C# Hình 5.3 Dẫn xuất từ Window Giả sử bắt đầu tạo loạt lớp đối tượng theo hình vẽ 5.3 bên Sau làm việc với RadioButton, CheckBox, CommandButton thời gian ta nhận thấy chúng chia xẻ nhiều thuộc tính hành vi đặc biệt Window lại tổng quát cho ba lớp Như ta chia thuộc tính hành vi thành nhóm lớp sở riêng lấy tên Button Sau ta xếp lại cấu trúc kế thừa hình vẽ 5.4 Đây ví dụ cách tổng quát hóa sử dụng để phát triển hướng đối tượng Window Button Check Box List Box Command Radio Button Hình 5.4: Cây quan hệ lớp cửa sổ Trong mơ hình UML vẽ lại quan hệ lớp Trong hai lớp Button ListBox điều dẫn xuất từ lớp Window, Button có trường hợp đặc biệt CheckBox Command Cuối RadioButton dẫn xuất từ CheckBox Chúng ta nói RadioButton CheckBox, tiếp tục CheckBox Button, cuối Button Window 128 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# Sự thiết kế hay cách tốt để tổ chức đối tượng, khởi điểm để hiểu cách quan hệ đối tượng với đối tượng khác Sự kế thừa Trong ngôn ngữ C#, quan hệ đặc biệt hóa thực thi cách sử dụng kế thừa Đây cách để thực thi đặc biệt hóa, cách chung tự nhiên để thực thi quan hệ Trong mơ hình trước, ta nói ListBox kế thừa hay dẫn xuất từ Window Window xem lớp sở, ListBox xem lớp dẫn xuất Như vậy, ListBox dẫn xuất tất thuộc tính hành vi từ lớp Window thêm phần đặc biệt riêng để xác nhận ListBox Thực thi kế thừa Trong ngôn ngữ C# để tạo lớp dẫn xuất từ lớp ta thêm dấu hai chấm vào sau tên lớp dẫn xuất trước tên lớp sở: public class ListBox : Window Đoạn lệnh khai báo lớp tên ListBox, lớp dẫn xuất từ Window Chúng ta đọc dấu hai chấm đọc “dẫn xuất từ” Lớp dẫn xuất kế thừa tất thành viên lớp sở, bao gồm tất phương thức biến thành viên lớp sở Lớp dẫn xuất tự thực thi phiên phương thức lớp sở Lớp dẫn xuất tạo phương thức việc đánh dấu với từ khóa new Ví dụ 5.1 sau minh họa việc tạo sử dụng lớp sở dẫn xuất Ví dụ 5.1: Sử dụng lớp dẫn xuất using System; public class Window { // Hàm khởi dựng lấy hai số nguyên // đến vị trí cửa sổ console public Window( int top, int left) { this.top = top; this.left = left; } // mô vẽ cửa sổ public void DrawWindow() { Console.WriteLine(“Drawing Window at {0}, {1}”, top, left); 129 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# } // Có hai biến thành viên private // hai biến khơng thấy bên lớp // dẫn xuất private int top; private int left; } // ListBox dẫn xuất từ Window public class ListBox: Window { // Khởi dựng có tham số public ListBox(int top, int left, string theContents) : base(top, left) // gọi khởi dựng lớp sở { mListBoxContents = theContents; } // Tạo phiên cho phương thức DrawWindow // lớp dẫn xuất muốn thay đổi hành vi thực // bên phương thức public new void DrawWindow() { base.DrawWindow(); Console.WriteLine(“ ListBox write: {0}”, mListBoxContents); } // biến thành viên private private string mListBoxContents; } public class Tester { public static void Main() { // tạo đối tượng cho lớp sở Window w = new Window(5, 10); w.DrawWindow(); // tạo đối tượng cho lớp dẫn xuất ListBox lb = new ListBox( 20, 10, “Hello world!”); lb.DrawWindow(); } 130 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# Phải chắn đối tượng boxing kiểu giá trị đưa Sao chép giá trị từ thể hay đối tượng vào biến kịểu giá trị Heap Stack i 123 int i = 123; i o 123 boxed Int 123 object o=i; k 123 int k = (int)o; Hình 5.6: Unboxing sau thực Boxing Để thực unboxing thành cơng, đối tượng unboxing phải tham chiếu đến đối tượng, đối tượng tạo việc boxing giá trị với kiểu giá trị đưa Boxing Unboxing minh họa ví dụ 5.5 Ví dụ 5.5: Boxing Unboxing using System; public class UnboxingTest { public static void Main() { int i = 123; // Boxing object o = i; // Unboxing phải tường minh int k = (int) o; Console.WriteLine(“k: {0}”, k); 146 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# } } Ví dụ 5.5 tạo số nguyên i thực boxing ngầm định i gán cho đối tượng o Sau giá trị unboxing cách tường minh gán đến biến nguyên int mới, cuối giá trị hiển thị Thông thường, bao bọc hoạt động unboxing khối try, trình bày Chương 13 Nếu đối tượng Unboxing null tham chiếu đến đối tượng có kiểu liệu khác, InvalidCastException phát sinh Các lớp lồng Các lớp chứa thành viên, thành viên lớp khác có kiểu người dùng định nghĩa (user-defined type) Do vậy, lớp Button có thành viên kiểu Location, kiểu Location chứa thành viên kiểu liệu Point Cuối cùng, Point chứa chứa thành viên kiểu int Cho đến lúc này, lớp tạo để dùng cho lớp bên ngoài, chức lớp lớp trợ giúp (helper class) Chúng ta định nghĩa lớp trợ giúp bên lớp (outer class) Các lớp định nghĩa bên gọi lớp lồng (nested class), lớp chứa gọi đơn giản lớp Những lớp lồng bên có lợi có khả truy cập đến tất thành viên lớp ngồi Một phương thức lớp lồng truy cập đến biến thành viên private lớp Hơn nữa, lớp lồng bên ẩn tất lớp khác, lớp lồng private cho lớp Cuối cùng, lớp làm lồng bên public truy cập bên phạm vi lớp Nếu lớp Outer lớp ngoài, lớp Nested lớp public lồng bên lớp Outer, tham chiếu đến lớp Tested Outer.Nested, lớp bên ngồi hành động nhiều giống namespace hay phạm vi Ghi chú: Đối với người lập trình Java, lớp lồng C# giống lớp nội static (static inner) Java Khơng có tương ứng C# với lớp nội nonstatic (nonstatic inner) Java Ví dụ 5.6 sau thêm lớp lồng vào lớp Fraction tên FractionArtist Chức lớp FractionArtis vẽ phân số hình Trong ví dụ này, việc vẽ thay sử dụng hàm WriteLine xuất hình console Ví dụ 5.6: Sử dụng lớp lồng using System; using System.Text; 147 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# public class Fraction { public Fraction( int numerator, int denominator) { this.numerator = numerator; this.denominator = denominator; } public override string ToString() { StringBuilder s = new StringBuilder(); s.AppendFormat(“{0}/{1}”,numerator, denominator); return s.ToString(); } internal class FractionArtist { public void Draw( Fraction f) { Console.WriteLine(“Drawing the numerator {0}”, f.numerator); Console.WriteLine(“Drawing the denominator {0}”, f.denominator); } } // biến thành viên private private int numerator; private int denominator; } public class Tester { static void Main() { Fraction f1 = new Fraction( 3, 4); Console.WriteLine(“f1: {0}”, f1.ToString()); Fraction.FractionArtist fa = new Fraction.FractionArtist(); fa.Draw( f1 ); } } Lớp Fraction nói chung khơng có thay đổi ngoại trừ việc thêm lớp lồng bên lược số phương thức khơng thích hợp ví dụ Lớp lồng bên 148 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# cung cấp phương thức thành viên nhất, phương thức Draw() Điều thú vị phương thức Draw() truy cập liệu thành viên private f.numerator f.denominator Hai viến thành viên private không cho phép truy cập FractionArtist lớp lồng bên lớp Fraction Lưu ý hàm Main() khai báo thể lớp lồng bên trong, phải xác nhận tên lớp bên ngoài, tức lớp Fraction: FractionArtist Fraction.FractionArtist fa = new Fraction.FractionArtist(); Thậm chí lớp FractionArtist public, phạm vị lớp nằm bên lớp Fraction Câu hỏi trả lời Câu hỏi 1: Có cần thiết phải định từ khóa override phương thức phủ lớp dẫn xuất hay khơng? Trả lời 1: Có, phải khai báo rõ ràng từ khóa override với phương thức phủ phương thức ảo (của lớp sở ) bên lớp dẫn xuất Câu hỏi 2: Lớp trừu tượng nào? Có thể tạo đối tượng cho lớp trừu tượng hay không? Trả lời 2: Lớp trừu tượng khơng có thực thi, phương thức tạo hình thức, tức có khai báo, phần định nghĩa bắt buộc phải thực lớp dẫn xuất từ lớp trừu tượng Do lớp trừu tượng, khơng có thực thi nên khơng thể tạo thể hay tạo đối tượng cho lớp trừu tượng Câu hỏi 3: Có phải tạo lớp phải kế thừa từ lớp không? Trả lời 3: Không thiết vậy, nhiên C#, tất lớp tạo điều phải dẫn xuất từ lớp Object Cho dù chúng có khai báo tường minh hay khơng Do Object lớp gốc tất lớp xây dựng C# Một điều thú vị kiểu liệu giá trị kiểu nguyên, thực, ký tự dẫn xuất từ Object Câu hỏi 4: Lớp lồng bên lớp nào? Trả lời 4: Lớp lồng bên lớp hay gọi lớp nội khai báo với từ khóa internal, chứa bên phạm vi lớp Lớp nội truy cập thành viên private lớp mà chứa bên Câu hỏi 5: Có thể kế thừa từ lớp sở viết ngôn ngữ khác ngôn ngữ C#? Trả lời 5: Được, đặc tính NET lớp kế thừa từ lớp viết từ ngôn ngữ khác Do vậy, C# ta kế thừa lớp viết từ ngôn ngữ khác NET Và ngôn ngữ khác kế thừa từ lớp C# mà ta tạo Câu hỏi thêm Câu hỏi 1: Sự đặt biệt hóa sử dụng C# thơng qua tính gì? Câu hỏi 2: Khái niệm đa hình gì? Khi cần sử dụng tính đa hình? Câu hỏi 3: Hãy xây dựng phân cấp lớp đối tượng sau: Xe_Toyota, Xe_Dream, Xe_Spacy, Xe_BMW, Xe_Fiat, Xe_DuLich, Xe_May, Xe? 149 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# Câu hỏi 4: Từ khóa new sử dụng làm lớp? Câu hỏi 5: Một phương thức ảo lớp sở có thiết phải phủ lớp dẫn xuất hay khơng? Câu hỏi 6: Lớp trừu tượng có cần thiết phải xây dựng hay khơng? Hãy cho ví dụ lớp trừu tượng cho số lớp Câu hỏi 7: Lớp lập gì? Có thể khai báo protected cho thành viên khơng? Câu hỏi 8: Lớp Object cung cấp phương thức mà lớp khác thường xuyên kế thừa để sử dụng Câu hỏi 9: Thế boxing unboxing? Hãy cho biết hai ví dụ q trình này? Bài tập Bài tập 1: Hãy mở rộng ví dụ chương xây dựng thêm đối tượng khác kế thừa lớp Window như: Label, TextBox, Scrollbar, toolbar, menu, Bài tập 2: Hãy xây dựng lớp đối tượng câu hỏi 3, thiết lập quan hệ kế thừa dựa kế thừa mà bạn xây dựng Mỗi đối tượng cần thuộc tính myNane biết tên (như Xe_Toyota myName “Toi la Toyota” ) Các đối tượng có phương thức Who() cho biết giá trị myName Hãy thực thi đa hình lớp Cuối tạo lớp Tester với hàm Main() để tạo mảng đối tượng Xe, đưa đối tượng cụ thể vào mảng đối tượng Xe, sau cho lặp đối tượng mảng để tự giới thiệu tên (bằng cách gọi hàm Who() đối tượng) Bài tập 3: Xây dựng lớp đối tượng hình học như: điểm, đoạn thẳng, đường trịn, hình chữ nhật, hình vng, tam giác, hình bình hành, hình thoi Mỗi lớp có thuộc tính riêng để xác định hình vẽ biểu diễn đoạn thẳng có điểm đầu, điểm cuối Mỗi lớp thực thi phương thức Draw() phủ Draw() lớp sở gốc hình mà dẫn xuất Hãy xây dựng lớp sở lớp thực thi đa hình với phương thức Draw() Sau tạo lớp Tester với hàm Main() để thử nghiệm đa hình giống tập Bài tập 4: Chương trình sau có lỗi Hãy sửa lỗi biên dịch chạy chương trình Cho biết lệnh gây lỗi Và nguyên nhân gây lỗi? using System; abstract public class Animal { public Animal(string name) { this.name = name; } 150 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# // phương thức trừu tượng minh họa việc // đưa tên đối tượng abstract public void Who(); // biến thành viên protected protected string name; } // lớp Dog dẫn xuất từ lớp Animal public class Dog : Animal { // hàm khởi dựng lấy hai tham số public Dog(string name, string color) : base(name) { this.color = color; } // phủ phương thức trừu tượng Who() public override void Who( ) { Console.WriteLine(“Gu gu! Toi la {0} co mau long {1}”, name, color); } // biến private lớp private string color; } public class Cat : Animal { // hàm khởi dựng lấy hai tham số public Cat(string name, int weight) : base(name) { this.weight = weight; } // phủ phương thức trừu tượng Who() public override void Who( ) { Console.WriteLine(“Meo meo! Toi la {0} can nang {1}”, name, weight); } // biến private lớp private int weight; } public class Tester 151 Kế Thừa – Đa Hình Ngơn Ngữ Lập Trình C# { static void Main() { Animal[] Arr = new Animal[3]; Arr[0] = new Dog(“Lu Lu”, “Vang”); Arr[1] = new Cat(“Mun”, 5); Arr[2] = new Animal(“Noname”); for( int i=0; i =) tương ứng với toán tử (, = Phải cung cấp phương thức thay cho toán tử nạp chồng Đa số ngơn ngữ điều khơng hỗ trợ nạp chồng tốn tử Vì nguyên nên phải thực thi phương thức thứ hai có chức với tốn tử Common Language Specification (CLS) địi hỏi phải thực phương thức thứ hai tương ứng Bảng 6.1 sau trình bày tốn tử với biểu tượng toán tử tên phương thức thay toán tử Biểu tượng Tên phương thức thay + Add Tên toán tử Toán tử cộng - Subtract Toán tử trừ * Multiply Toán tử nhân 155 Nạp Chồng Tốn Tử Ngơn Ngữ Lập Trình C# / Divide Toán tử chia % Mod ^ Xor Toán tử chia lấy dư Toán tử or loại trừ & BitwiseAnd | BitwiseOr && And || Or = Assign > RightShift == Equals > Compare < Compare != Compare >= Compare