Kế Thừa-Đa Hình phần cuối
Số trang: 8
Loại file: pdf
Dung lượng: 190.36 KB
Lượt xem: 10
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Các lớp lồng nhau Các lớp chứa những thành viên, và những thành viên này có thể là một lớp khác có kiểu do người dùng định nghĩa (user-defined type)
Nội dung trích xuất từ tài liệu:
Kế Thừa-Đa Hình phần cuốiCác lớp lồng nhau Các lớp chứa những thành viên, và những thành viên này có thể là một lớp khác có kiểu do người dùng định nghĩa (user-defined type). Do vậy, một lớp Button có thể có một thành viên của kiểu Location, và kiểu Location này chứa thành viên của kiểu dữ liệu Point. Cuối cùng, Point có thể chứa chứa thành viên của kiểu int. Cho đến lúc này, các lớp được tạo ra chỉ để dùng cho các lớp bên ngoài, và chức năng của các lớp đó như là lớp trợ giúp (helper class). Chúng ta có thể định nghĩa một lớp trợ giúp bên trong các lớp ngoài (outer class). Các lớp được định nghĩa bên trong gọi là các lớp lồng (nested class), và lớp chứa được gọi đơn giản là lớp ngoài. Những lớp lồng bên trong có lợi là có khả năng truy cập đến tất cả các thành viên của lớp ngoài. Một phương thức của lớp lồng có thể truy cập đến biến thành viên private của lớp ngoài. Hơn nữa, lớp lồng bên trong có thể ẩn đối với tất cả các lớp khác, lớp lồng có thể là private cho lớp ngoài. Cuối cùng, một lớp làm lồng bên trong là public và được truy cập bên trong phạm vi của lớp ngoài. Nếu một lớp Outer là lớp ngoài, và lớp Nested là lớp public lồng bên trong lớp Outer, chúng ta có thể tham chiếu đến lớp Tested như Outer.Nested, khi đó lớp bên ngoài hành động ít nhiều giống như một namespace hay một phạm vi. Ghi chú: Đối với người lập trình Java, lớp lồng nhau trong C# thì giống như những lớp nội static (static inner) trong Java. Không có sự tương ứng trong C# với những lớp nội nonstatic (nonstatic inner) trong Java. Ví dụ 5.6 sau sẽ thêm một lớp lồng vào lớp Fraction tên là FractionArtist. Chức năng của lớpFractionArtis là vẽ một phân số ra màn hình. Trong ví dụ này, việc vẽ sẽ được thay thế bằng sử dụng hàm WriteLine xuất ra màn hình console. Ví dụ 5.6: Sử dụng lớp lồng nhau. ----------------------------------------------------------------------------- using System; using System.Text;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 trên nói chung là không có gì thay đổi ngoại trừ việc thêm một lớp lồngbên trong và lược đi một số phương thức không thích hợp trong ví dụ này. Lớp lồngbên trong FractionArtist chỉ cung cấp một phương thức thành viên duy nhất, phươngthức Draw(). Điều thú vị trong phương thức Draw() truy cập dữ liệu thành viênprivate là f.numerator và f.denominator. Hai viến thành viên private này sẽkhông cho phép truy cập nếu FractionArtist không phải là lớp lồng bên trong của lớpFraction.Lưu ý là trong hàm Main() khi khai báo một thể hiện của lớp lồng bên trong, chúng taphải xác nhận tên của lớp bên ngoài, tức là lớp Fraction: Fraction.FractionArtist fa = new Fraction.FractionArtist();Thậm chí khi lớp FractionArtist là public, thì phạm vị của lớp này vẫn nằm bên trongcủa lớpFraction.Câu hỏi và trả lời Câu hỏi 1: Có cần thiết phải chỉ định từ khóa override trong phương thức phủ quyết của lớp dẫn xuất hay không?Trả lời 1: Có, chúng ta phải khai báo rõ ràng từ khóa override với phương thức phủquyết phương thức ảo (của lớp cơ sở ) bên trong lớp dẫn xuất.Câuhỏi 2: Lớp trừu tượng là thế nào? Có thể tạo đối tượng cho lớp trừu tượng haykhông?Trả lời 2: Lớp trừu tượng không có sự thực thi, các phương thức của nó được tạo ra chỉlà hình thức, tức là chỉ có khai báo, do vậy phần định nghĩa bắt buộc phải được thựchiện ở cáclớp dẫn xuất từ lớp trừu tượng này. Do chỉ là lớp trừu tượng, không có sự thực thi nênchúngta không thể tạo thể hiện hay tạo đối tượng cho lớp trừu tượng này.Câuhỏi 3: Có phải khi tạo một lớp thì phải kế thừa từ một lớp nào không?Trảlời 3: Không nhất thiết như vậy, tuy nhiên trong C#, thì tất cả các lớp được tạo điềuphải dẫn xuất từ lớp Object. Cho dù chúng có được khai báo tường minh hay không. Dođó Objectlà lớp gốc của tất cả các lớp được xây dựng trong C#. Một điều thú vị là các kiểu dữliệu giátrị như kiểu nguyên, thực, ký tự cũng được dẫn xuất từObject.Câuhỏi 4: Lớp lồng bên trong một lớp là như thế nào?Trả lời 4: Lớp lồng bên trong một lớp hay còn gọi là lớp nội được khai báo vớitừ khóa internal, chứa bên trong phạm vi của một lớp. Lớp nội có thể truy cập đượccác thành viên private của lớp mà nó chứa bên trongCâuhỏi 5: Có thể kế thừa từ một lớp cơ sở được viết trong ngôn ngữ khác ngôn ngữC#?Trả lời 5: Được, một trong những đặc tính của .NET là các lớp có thể kế thừa từcác lớp được viết từ ngôn ngữ khác. Do vậy, trong C# ta có thể kế thừa một lớpđược viết từ ngôn ngữ khác của .NET. Và những ngôn ngữ khác cũng có thể kế thừatừ các lớp C# mà ta tạo ra.Câu hỏi thêm Câuhỏi 1: Sự đặt biệt hóa được sử dụng trong C# thông qua tính gì? Câuhỏi 2: Khái niệm đa hình là gì? Khi nào thì cần sử dụng tính đa hình? Câu hỏi 3: Hãy xây dựng cây phân cấp các lớp đối tượng sau: Xe_Toyota, Xe_Dream, Xe_Spacy, Xe_BMW, Xe_Fiat, Xe_DuLich, Xe_May, Xe? Câuhỏi 4: Từ khóa new được sử dụng làm gì trong các lớp? Câu hỏi 5: Một phươ ...
Nội dung trích xuất từ tài liệu:
Kế Thừa-Đa Hình phần cuốiCác lớp lồng nhau Các lớp chứa những thành viên, và những thành viên này có thể là một lớp khác có kiểu do người dùng định nghĩa (user-defined type). Do vậy, một lớp Button có thể có một thành viên của kiểu Location, và kiểu Location này chứa thành viên của kiểu dữ liệu Point. Cuối cùng, Point có thể chứa chứa thành viên của kiểu int. Cho đến lúc này, các lớp được tạo ra chỉ để dùng cho các lớp bên ngoài, và chức năng của các lớp đó như là lớp trợ giúp (helper class). Chúng ta có thể định nghĩa một lớp trợ giúp bên trong các lớp ngoài (outer class). Các lớp được định nghĩa bên trong gọi là các lớp lồng (nested class), và lớp chứa được gọi đơn giản là lớp ngoài. Những lớp lồng bên trong có lợi là có khả năng truy cập đến tất cả các thành viên của lớp ngoài. Một phương thức của lớp lồng có thể truy cập đến biến thành viên private của lớp ngoài. Hơn nữa, lớp lồng bên trong có thể ẩn đối với tất cả các lớp khác, lớp lồng có thể là private cho lớp ngoài. Cuối cùng, một lớp làm lồng bên trong là public và được truy cập bên trong phạm vi của lớp ngoài. Nếu một lớp Outer là lớp ngoài, và lớp Nested là lớp public lồng bên trong lớp Outer, chúng ta có thể tham chiếu đến lớp Tested như Outer.Nested, khi đó lớp bên ngoài hành động ít nhiều giống như một namespace hay một phạm vi. Ghi chú: Đối với người lập trình Java, lớp lồng nhau trong C# thì giống như những lớp nội static (static inner) trong Java. Không có sự tương ứng trong C# với những lớp nội nonstatic (nonstatic inner) trong Java. Ví dụ 5.6 sau sẽ thêm một lớp lồng vào lớp Fraction tên là FractionArtist. Chức năng của lớpFractionArtis là vẽ một phân số ra màn hình. Trong ví dụ này, việc vẽ sẽ được thay thế bằng sử dụng hàm WriteLine xuất ra màn hình console. Ví dụ 5.6: Sử dụng lớp lồng nhau. ----------------------------------------------------------------------------- using System; using System.Text;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 trên nói chung là không có gì thay đổi ngoại trừ việc thêm một lớp lồngbên trong và lược đi một số phương thức không thích hợp trong ví dụ này. Lớp lồngbên trong FractionArtist chỉ cung cấp một phương thức thành viên duy nhất, phươngthức Draw(). Điều thú vị trong phương thức Draw() truy cập dữ liệu thành viênprivate là f.numerator và f.denominator. Hai viến thành viên private này sẽkhông cho phép truy cập nếu FractionArtist không phải là lớp lồng bên trong của lớpFraction.Lưu ý là trong hàm Main() khi khai báo một thể hiện của lớp lồng bên trong, chúng taphải xác nhận tên của lớp bên ngoài, tức là lớp Fraction: Fraction.FractionArtist fa = new Fraction.FractionArtist();Thậm chí khi lớp FractionArtist là public, thì phạm vị của lớp này vẫn nằm bên trongcủa lớpFraction.Câu hỏi và trả lời Câu hỏi 1: Có cần thiết phải chỉ định từ khóa override trong phương thức phủ quyết của lớp dẫn xuất hay không?Trả lời 1: Có, chúng ta phải khai báo rõ ràng từ khóa override với phương thức phủquyết phương thức ảo (của lớp cơ sở ) bên trong lớp dẫn xuất.Câuhỏi 2: Lớp trừu tượng là thế nào? Có thể tạo đối tượng cho lớp trừu tượng haykhông?Trả lời 2: Lớp trừu tượng không có sự thực thi, các phương thức của nó được tạo ra chỉlà hình thức, tức là chỉ có khai báo, do vậy phần định nghĩa bắt buộc phải được thựchiện ở cáclớp dẫn xuất từ lớp trừu tượng này. Do chỉ là lớp trừu tượng, không có sự thực thi nênchúngta không thể tạo thể hiện hay tạo đối tượng cho lớp trừu tượng này.Câuhỏi 3: Có phải khi tạo một lớp thì phải kế thừa từ một lớp nào không?Trảlời 3: Không nhất thiết như vậy, tuy nhiên trong C#, thì tất cả các lớp được tạo điềuphải dẫn xuất từ lớp Object. Cho dù chúng có được khai báo tường minh hay không. Dođó Objectlà lớp gốc của tất cả các lớp được xây dựng trong C#. Một điều thú vị là các kiểu dữliệu giátrị như kiểu nguyên, thực, ký tự cũng được dẫn xuất từObject.Câuhỏi 4: Lớp lồng bên trong một lớp là như thế nào?Trả lời 4: Lớp lồng bên trong một lớp hay còn gọi là lớp nội được khai báo vớitừ khóa internal, chứa bên trong phạm vi của một lớp. Lớp nội có thể truy cập đượccác thành viên private của lớp mà nó chứa bên trongCâuhỏi 5: Có thể kế thừa từ một lớp cơ sở được viết trong ngôn ngữ khác ngôn ngữC#?Trả lời 5: Được, một trong những đặc tính của .NET là các lớp có thể kế thừa từcác lớp được viết từ ngôn ngữ khác. Do vậy, trong C# ta có thể kế thừa một lớpđược viết từ ngôn ngữ khác của .NET. Và những ngôn ngữ khác cũng có thể kế thừatừ các lớp C# mà ta tạo ra.Câu hỏi thêm Câuhỏi 1: Sự đặt biệt hóa được sử dụng trong C# thông qua tính gì? Câuhỏi 2: Khái niệm đa hình là gì? Khi nào thì cần sử dụng tính đa hình? Câu hỏi 3: Hãy xây dựng cây phân cấp các lớp đối tượng sau: Xe_Toyota, Xe_Dream, Xe_Spacy, Xe_BMW, Xe_Fiat, Xe_DuLich, Xe_May, Xe? Câuhỏi 4: Từ khóa new được sử dụng làm gì trong các lớp? Câu hỏi 5: Một phươ ...
Tìm kiếm theo từ khóa liên quan:
Công nghệ thông tin kỹ thuật lập trình ngôn ngữ lập trình ngôn ngữ C# C# Kế Thừa-Đa Hình phần cuốiGợi ý tài liệu liên quan:
-
52 trang 417 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 301 0 0 -
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 287 0 0 -
74 trang 283 0 0
-
96 trang 283 0 0
-
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 270 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 268 1 0 -
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 264 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 260 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 253 0 0