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

Tài liệu XÂY DỰNG LỚP - ĐỐI TƯỢNG phần cuối pdf

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 (194.46 KB, 8 trang )

Truy cập lấy dữ liệu (get accessor)

Phần khai báo tương tự như một phương thức của lớp dùng để trả về một đối
tượng có kiểu dữ liệu của thuộc tính. Trong ví dụ trên, bộ truy cập lấy dữ liệu get
của thuộc tính Hour cũng tương tự như một phương thức trả về một giá trị int. Nó
trả về giá trị của biế
n thành viên hour nơi mà giá trị của thuộc tính Hour lưu trữ:
get

{


return hour;

}


Trong ví dụ này, một biến thành viên cục bộ được trả về, nhưng nó cũng có thể truy
cập dễ dàng một giá trị nguyên từ cơ sở dữ lịêu, hay thực hiện việc tính toán tùy ý.
Bất cứ khi nào chúng ta tham chiếu đến một thuộc tính hay là gán giá trị thuộc tính cho
một biến thì bộ truy cập lấy dữ liệu get sẽ được thực hiện để đọc giá trị của thuộc tính:
Time t = new Time( currentTime );

int theHour = t.Hour;
Khi lệnh thứ hai được thực hiện thì giá trị của thuộc tính sẽ được trả về, tức là bộ truy
cập lấy dữ lịêu get sẽ được thực hiện và kết quả là giá trị của thuộc tính được gán cho
biến cục bộ theHour.

Bộ truy cập thiết lập dữ liệu ( set accessor)

Bộ truy cập này sẽ thiết lập một giá trị mới cho thuộc tính và t


ương tự như một
phương thức trả về một giá trị void. Khi định nghĩa bộ truy cập thiết lập dữ lịêu chúng ta
phải sử dụng từ khóa value để đại diện cho tham số được truyền vào và được lưu trữ bởi
thuộc tính:

set

{


hour = value;

}

Như đã nói trước, do ta đang khai báo thuộc tính lưu trữ dưới dạng biến thành viên
nên trong phần thân của bộ truy cập ta chỉ sử dụng biến thành viên mà thôi. Bộ truy
cập thiết lập hoàn toàn cho phép chúng ta có thể viết giá trị vào trong cơ sở dữ lịêu
hay cập nhật bất cứ biến thành viên nào khác của lớp nếu cần thiết.

Khi chúng ta gán một giá trị cho thuộc tính thì bộ truy cập thiết lập dữ li
ệu set sẽ
được tự động thực hiện và một tham số ngầm định sẽ được tạo ra để lưu giá trị mà ta
muốn gán:
theHour++;

t.Hour = theHour;

Lợi ích của hướng tiếp cận này cho phép các thành phần bên ngoài (client) có thể
tương tácvới thuộc tính một cách trực tiếp, mà không phải hy sinh việc che dấu dữ
lịêu cũng như đặc tính đóng gói dữ lịêu trong thiết kế hướng đối tượng.

Thuộc tính chỉ đọc

Giả sử chúng ta muốn tạo một phiên bản khác cho lớp Time cung cấp một số giá trị
static để hiển thị ngày và giờ hi
ện hành. Ví dụ 4.12 minh họa cho cách tiếp cận này.
Ví dụ 4.12: Sử dụng thuộc tính hằng static.
-----------------------------------------------------------------------------

using System;

public class RightNow

{


// Định nghĩa bộ khởi tạo static cho các biến static
static RightNow()
{


System.DateTime dt =
System.DateTime.Now; Year = dt.Year;
Month =
dt.Month; Date =
dt.Day; Hour =
dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}



// Biến thành viên static
public static int Year;
public static int Month;
public static int Date;
public static int Hour;
public static int Minute;
public static int Second;
}

public class Tester

{


static void Main()




{

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 trên hoạt động tốt, tuy nhiên cho đến khi có một ai đó thay đổi giá
trị của biến thành viên này. Như ta thấy, biến thành Year trên đã được thay đổi đến
2003. Điều này thực sự không như mong muốn của chúng ta.
Chúng ta muốn đánh dấu các thuộc tính tĩnh này không được thay đổi. Nhưng khai
báo hằng cũng không được vì biến tĩnh không đượ
c khởi tạo cho đến khi phương thức
khởi dựng static được thi hành. Do vậy C# cung cấp thêm từ khóa readonly phục vụ
chính xác cho mục đich trên. Với ví dụ trên ta có cách khai báo lại như 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, vì nếu không sẽ bị báo lỗi:

// RightNow.Year = 2003; // error

Chương trình sau khi biên dịch và thực hiện như mục đích của chúng ta.

Câu hỏi và trả lời

Câuhỏi
1: Có phải chúng ta chỉ nên sử dụng lớp với các dữ liệu thành viên?
Trả lời 1
: Nói chung là chúng ta không nên sử dụng lớp chỉ với dữ liệu thành viên. Ý
nghĩa của môt lớp hay của lập trình hướng đối tượng là khả năng đóng gói các
chức năng và dữ liệu vào trong một gói đơn.
Câu hỏi 2
: Có phải tất cả những dữ liệu thành viên luôn luôn được khai báo là public để
bên ngoài có thể truy cập chúng?
Trả l ời 2
: Nói chung là không. Do vấn đề che dấu dữ liệu trong lập trình hướng đối
tượng,
xu hướng là dữ liệu bên trong chỉ nên dùng cho các phương thức thành viên. Tuy
nhiên, như chúng ta đã biết khái niệm thuộc tính cho phép các biến thành viên
được truy cập từ bên ngoài thông qua hình thức như là phương thức.
Câuhỏi
3: Có phải có rất nhiều lớp được xây dựng sẵn và tôi có thể tìm chúng ở đâu?
Trả lời 3
: Microsoft cung cấp rất nhiều các lớp gọi là các lớp cơ sở .NET. Những
lớp này được tổ chức bên trong các namespace. Chúng ta có thể tìm tài liệu về các
lớp này trong thư viện trực tuyến của Microsoft. Và một số lớp thường sử dụng
cũng được trình bày lần lượt trong các ví dụ của giáo trình này.
Câuhỏi
4: Sự khác nhau giữa tham số (parameter) và đối mục (argument)?
Trả l ời 4
: Tham số được định nghĩa là những thứ được truyền vào trong một phương

thức. Một tham số xuất hiện với định nghĩa của phương thức ở đầu phương thức. Một
đối mục là giá trị được truyền vào phương thức. Chúng ta truyền những đối mục vào
phương thức phù hợp với những tham số đã khai báo của phương thức.
Câuhỏi
5: Chúng ta có thể tạo phương thức bên ngoài của lớp hay không?
Trả lời 5
: Mặc dù trong những ngôn ngữ khác, chúng ta có thể tạo các phương
thức bên ngoài của lớp. Nhưng trong C# thì không, C# là hướng đối tượng, do
vậy tất cả các mã nguồn phải được đặt bên trong một lớp.
Câu hỏi 6
: Có phải những phương thức và lớp trong C# hoạt động tương tự như trong
các ngôn ngữ khác như C++ hay Java?
Trả lời 6
: Trong hầu hết các phần thì chúng tương tự như nhau. Tuy nhiên, mỗi
ngôn ngữ cũng có những khác biệt riêng. Một ví dụ sự khác nhau là C# không cho
phép tham số mặc định bên trong một phương thức. Trong ngôn ngữ C++ thì
chúng ta có thể khai báo các tham số mặc định lúc định nghĩa phương thức và khi
gọi phương thức thì có thể không cần truyền giá trị vào, phương thức sẽ dùng giá trị
mặc định. Trong C# thì không được phép. Nói chung là còn nhiều sự khác nhau nữa,
như
ng xin dành cho bạn đọc tự tìm hiểu.
Câu hỏi 7
: Phương thức tĩnh có thể truy cập được thành viên nào và không truy cập
được thành viên nào trong một lớp?
Trả l ời 7
: Phương thức tĩnh chỉ truy cập được các thành viên tĩnh trong một lớp.

Câu hỏi thêm

Câu hỏi 1

: Sự khác nhau giữa thành viên được khai báo là public và các thành viên
không được khai báo là public?
Câuhỏi
2: Từ khoá nào được sử dụng trong việc thực thi thuộc tính của
lớp?
Câuhỏi
3: Những kiểu dữ liệu nào được trả về từ phương thức?
Câu hỏi 4
: Sự khác nhau giữa truyền biến tham chiếu và truyền biến tham trị vào
một phương thức?
Câuhỏi 5
: Làm sao truyền tham chiếu với biến kiểu giá trị vào trong một phương thức?
Câuhỏi
6: Khi nào thì phương thức khởi dựng được
gọi?
Câuhỏi
7: Phương thức khởi dựng tĩnh được gọi khi
nào?
Câuhỏi
8: Có thể truyền biến chưa khởi tạo vào một hàm được
không?
Câuhỏi
9: Sự khác nhau giữa một lớp và một đối tượng của lớp?
Câu hỏi 10
: Thành viên nào trong một lớp có thể được truy cập mà không phải tạo thể
hiện của lớp?
Câuhỏi
11: Lớp mà chúng ta xây dựng thuộc kiểu dữ liệu
nào?
Câuhỏi

12: Từ khóa this được dùng làm gì trong một lớp?
Bài tập

Bài tập 1
: Xây dựng một lớp đường tròn lưu giữ bán kính và tâm của đường tròn. Tạo
các phương thức để tính chu vi, diện tích của đường tròn.
Bài tập2
: Thêm thuộc tính BanKinh vào lớp được tạo ra từ bài tập 1.
Bài tập 3
: Tạo ra một lớp lưu trữ giá trị nguyên tên myNumber. Tạo thuộc tính cho
thành viên này. Khi số được lưu trữ thì nhân cho 100. Và khi số được truy cập thì chia
cho 100.
Bài tập 4
: Chương trình sau có lỗi. Hãy sửa lỗi của chương trình và biên dịch chương
trình. Dòng lệnh nào gây ra lỗi?
-----------------------------------------------------------------------------

using System;

using System.Console;

class VD1

{


public string first;

}



class Tester

{


public static void Main()

{


VD1 vd = new VD1();

×