Tải bản đầy đủ (.pdf) (5 trang)

Giáo trình hướng dẫn phân tích tạo ra những kiểu dữ liệu mới bằng việc tạo ra các lớp đối tượng đa hình p6 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (904.65 KB, 5 trang )

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 trên nói chung là không có gì thay đổi ngoại trừ việc thêm một lớp lồng bê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ồng bên trong
Kế Thừa – Đa Hình
148
.
.
Ngôn Ngữ Lập Trình C#
FractionArtist chỉ cung cấp một phương thức thành viên duy nhất, phương thức Draw(). Điều
thú vị trong phương thức Draw() truy cập dữ liệu thành viên private 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ớp Fraction.
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 ta phả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 trong của lớp
Fraction.
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âu hỏ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 hay khô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ực hiện ở các

lớ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ên chúng
ta không thể tạo thể hiện hay tạo đối tượng cho lớp trừu tượng này.
Câu hỏ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ều phả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 đó Object
là 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âu hỏ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ới từ 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 được các thành viên
private của lớp mà nó chứa bên trong
Câu hỏ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ừa từ các lớp C# mà ta tạo ra.
Câu hỏi thêm
Câu hỏi 1: Sự đặt biệt hóa được sử dụng trong C# thông qua tính gì?
Câu hỏ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?
Kế Thừa – Đa Hình
149
.
.
Ngôn Ngữ Lập Trình C#
Câu hỏ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ương thức ảo trong lớp cơ sở có nhất thiết phải được phủ quyết trong 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 một ví dụ về một
lớp trừu tượng cho một số lớp.

Câu hỏi 7: Lớp cô lập là gì? Có thể khai báo protected cho các thành viên của nó được
không?
Câu hỏi 8: Lớp Object cung cấp những phương thức nào mà các lớp khác thường xuyên kế
thừa để sử dụng.
Câu hỏi 9: Thế nào là boxing và unboxing? Hãy cho biết hai ví dụ về quá trình này?
Bài tập
Bài tập 1: Hãy mở rộng ví dụ trong chương xây dựng thêm các đố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 các lớp đối tượng trong câu hỏi 3, thiết lập các quan hệ kế thừa dựa
trên cây kế thừa mà bạn xây dựng. Mỗi đối tượng chỉ cần một thuộc tính là myNane để cho
biết tên của nó (như Xe_Toyota thì myName là “Toi la Toyota” ). Các đối tượng có phương
thức Who() cho biết giá trị myName của nó. Hãy thực thi sự đa hình trên các lớp đó. Cuối
cùng tạo một lớp Tester với hàm Main() để tạo một mảng các đối tượng Xe, đưa từng đối
tượng cụ thể vào mảng đối tượng Xe, sau đó cho lặp từng đối tượng trong mảng để nó tự giới
thiệu tên (bằng cách gọi hàm Who() của từng đối tượng).
Bài tập 3: Xây dựng các 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 vuông, tam giác, hình bình hành, hình thoi. Mỗi lớp có các thuộc tính riêng để
xác định được hình vẽ biểu diễn của nó như đoạn thẳng thì có điểm đầu, điểm cuối Mỗi
lớp thực thi một phương thức Draw() phủ quyết Draw() của lớp cơ sở gốc của các hình mà
nó dẫn xuất. Hãy xây dựng lớp cơ sở của các lớp trên và thực thi đa hình với phương thức
Draw(). Sau đó tạo lớp Tester cùng với hàm Main() để thử nghiệm đa hình giống như bài tập
2 ở trên.
Bài tập 4: Chương trình sau đây có lỗi. Hãy sửa lỗi biên dịch và chạy chương trình. Cho biết
lệnh nào gây ra lỗi. Và nguyên nhân gây ra lỗi?

using System;
abstract public class Animal
{
public Animal(string name)
{

this.name = name;
}
Kế Thừa – Đa Hình
150
.
.
Ngôn Ngữ Lập Trình C#
// phương thức trừu tượng minh họa việc
// đưa tên của đố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ủ quyết 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 của 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ủ quyết 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 của lớp
private int weight;
}
public class Tester
Kế Thừa – Đa Hình
151
.
.
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 <3 ; i++)
{
Arr[i].Who();

}
}
}

Kế Thừa – Đa Hình
152
.
.

×