1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Kế Thừa-Đa Hình phần cuối ppt

8 333 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tài Liệu Kế Thừa-Đa Hình Phần Cuối Ppt
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Phần Mềm
Thể loại Tài liệu
Định dạng
Số trang 8
Dung lượng 190,36 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Những lớp lồng bên trong có lợi là có khả năng truy cập

Trang 1

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;

Trang 2

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 );

}

Trang 3

-

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 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â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 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â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ề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â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ớ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

Trang 4

Câ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ừa

từ 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ươ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âuhỏ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ập2: 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

Trang 5

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;

}

Trang 6

// 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

Trang 7

public class

Tester

Trang 8

{

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();

}

}

}

Ngày đăng: 26/01/2014, 03:20

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm