LỚP VÀ ĐỐI TƯỢNG

Xây dng các lp đi tưng là kh năng đ to ra nhng kiu d liu mi, mt đc tính quan trng ca ngôn ng lp trình hưng đi tưng. Chúng ta có th xây dng nhng kiu d liu mi trong ngôn ng C# bng cách khai báo và đnh nghĩa nhng lp. Th hin ca mt lp đưc gi là nhng đi tưng (object). Nhng đi tưng này đưc to trong b nh khi chương trình đưc thc hin.

S khác nhau gia mt lp và mt đi tưng cũng ging như s khác nhau gia khái nim gia loài mèo và mt con mèo Mun đang nm bên chân ca ta. Chúng ta không th đng chm hay đùa gin vi khái nim mèo nhưng có th thc hin điu đó đưc vi mèo Mun, nó là mt thc th sng đng, ch không tru tưng như khái nim h loài mèo.

Mt h mèo mô t nhng con mèo có các đc tính: có trng lưng, có chiu cao, màu mt, màu lông,...chúng cũng có hành đng như là ăn ng, leo trèo,...mt con mèo, ví d như mèo Mun chng hn, nó cũng có trng lưng xác đnh là 5 kg, chiu cao 15 cm, màu mt đen, lông đen...Nó cũng có nhng kh năng như ăn ng leo trèo,..

Li ích to ln ca nhng lp trong ngôn ng lp trình là kh năng đóng gói các thuc tính và tính cht ca mt thc th trong mt khi đơn, t có nghĩa, t kh năng duy trì . Ví d khi chúng ta mun sp ni dung nhng th hin hay đi tưng ca lp điu khin ListBox trên Windows, ch cn gi các đi tưng này thì chúng s t sp xếp, còn vic chúng làm ra sao thì ta không quan tâm, và cũng ch cn biết by nhiêu đó thôi.

Đóng gói cùng vi đa hình (polymorphism) và kế tha (inheritance) là các thuc tính chính yếu ca bt k mt ngôn ng lp trình hưng đi tưng nào.

1.     Định nghĩa lớp

Đ đnh nghĩa mt kiu d liu mi hay mt lp đu tiên phi khai báo ri sau đó mi đnh nghĩa các thuc tính và phương thc ca kiu d liu đó. Khai báo mt lp bng cách s dng t khoá class. Cú pháp đy đ ca khai báo mt lp như sau:

 

[Thuộc tính] [Bổ sung truy cập] class <Định danh lớp> [: Lớp cơ sở]

{

<Phần thân của lớp: bao gồm định nghĩa các thuộc tính và phương thức hành động >

 

}

Thành phn thuc tính ca đi tưng s đưc trình bày chi tiết trong phn sau, còn thành phn b sung truy cp cũng s đưc trình bày tiếp ngay mc dưi. Đnh danh lp chính là tên ca lp do ngưi xây dng chương trình to ra. Lp cơ s là lp mà đi tưng s kế tha đ phát trin ta s bàn sau. Tt c các thành viên ca lp đưc đnh nghĩa bên trong thân ca lp, phn thân này s đưc bao bc bi hai du ({}).

Trong C#, mi chuyn đu xy ra trong mt lp. Như các ví d mà chúng ta đã tìm hiu, các hàm điu đưc đưa vào trong mt lp, k c hàm đu vào ca chương trình (hàm Main()):

 

public class Tester

{

public static int Main()

{

//....

}

}

Điu cn nói đây là chúng ta chưa to bt c th hin nào ca lp, tc là to đi tưng cho lp Tester. Điu gì khác nhau gia mt lp và th hin ca lp? đ tr li cho câu hi này chúng ta bt đu xem xét s khác nhau gia kiu d liu int và mt biến kiu int . Ta có viết như sau:

 

      int var1 = 10;

tuy nhiên ta không th viết đưc

      int = 10;

 

Ta không th gán giá tr cho mt kiu d liu, thay vào đó ta ch đưc gán d liu cho mt đi tưng ca kiu d lêu đó, trong trưng hp trên đi tưng là biến var1.

Khi chúng ta to mt lp mi, đó chính là vic đnh nghĩa các thuc tính và hành vi ca tt c các đi tưng ca lp. Gi s chúng ta đang lp trình đ to các điu khin trong các ng dng trên Windows, các điu khin này giúp cho ngưi dùng tương tác tt vi Windows, như là ListBox, TextBox, ComboBox,...Mt trong nhng điu khin thông dng là ListBox, điu khin này cung cp mt danh sách lit kê các mc chn và cho phép ngưi dùng chn các mc tin trong đó.

ListBox này cũng có các thuc tính khác nhau nhu: chiu cao, b dày, v trí, và màu sc th hin và các hành vi ca chúng như: chúng có th thêm bi mc tin, sp xếp,...

Ngôn ng lp trình hưng đi tưng cho phép chúng ta to kiu d liu mi là lp ListBox, lp này bao bc các thuc tính cũng như kh năng như: các thuc tính height, width, location, color, các phương thc hay hành vi như Add(), Remove(), Sort(),...

Chúng ta không th gán d liu cho kiu ListBox, thay vào đó đu tiên ta phi to mt đi tưng cho lp đó:

      ListBox myListBox;

Mt khi chúng ta đã to mt th hin ca lp ListBox thì ta có th gán d liu cho th hin đó. Tuy nhiên đon lnh trên chưa th to đi tưng trong b nh đưc, ta s bàn tiếp. Bây gi ta s tìm hiu cách to mt lp và to các th hin thông qua ví d minh ha 4.1. Ví d này to mt lp có chc năng hiu th thi gian trong mt ngày. Lp này có hành vi th hin ngày, tháng, năm, gi, phút, giây hin hành. Đ làm đưc điu trên thì lp này có 6 thuc tính hay còn gi là biến thành viên, cùng vi mt phương thc như sau:

//Tạo một lớp Thoigian đơn giản như sau:

 

------------------------------------------------------------------

using System;

public class ThoiGian

{

public void ThoiGianHienHanh()

{

Console.WriteLine(“Hien thi thoi gian hien hanh”);

}

//Các biến thành viên

int Nam;

int Thang;

int Ngay;

int Gio;

int Phut;

int Giay;

}

public class Tester

{

static void Main()

{

ThoiGian t = new ThoiGian();

t.ThoiGianHienHanh();

}

}

 

------------------------------------------------------------------

Kết quả:

Hien thi thoi gian hien hanh

------------------------------------------------------------------

Lp ThoiGian ch có mt phương thc chính là hàm ThoiGianHienHanh(), phn thân ca phương thc này đưc đnh nghĩa bên trong ca lp ThoiGian. Điu này khác vi ngôn ng C++, C# không đòi hi phi khai báo trưc khi đnh nghĩa mt phương thc, và cũng không h tr vic khai báo phương thc trong mt tp tin và sau đó đnh nghĩa mt tp tin khác. C# không có các tp tin tiêu đ, do vy tt c các phương thc đưc đnh nghĩa hoàn toàn bên trong ca lp. Phn cui ca đnh nghĩa lp là phn khai báo các biến thành viên: Nam, Thang, Ngay, Gio, Phut, va Giay.

Sau khi đnh nghĩa xong lp ThoiGian thì tiếp theo là phn đnh nghĩa lp Tester, lp này có cha mt hàm khá thân thin vi chúng ta là hàm Main(). Bên trong hàm Main có mt th hin ca lp ThoiGian đưc to ra và gán giá tr cho đi tưng t. Bi vì t là th hin ca đi tưng ThoiGian, nên hàm Main() có th s dng phương thc ca t:

 

t.ThoiGianHienHanh();

 

Thuộc tính truy cập

Thuc tính truy cp quyết đnh kh năng các phương thc ca lp bao gm vic các phương thc ca lp khác có th nhìn thy và s dng các biến thành viên hay nhng phương thc bên trong lp. Bng 1.13 tóm tt các thuc tính truy cp ca mt lp trong C#.

Bảng 1.13. Thuộc tính truy cập

Thuộc tính

Giới hạn truy cập

public

Không hạn chế. Những thành viên được đánh dấu public có thể được dùng bởi bất kì các phương thức của lớp bao gồm những lớp khác.

private

Thành viên trong một lớp A được đánh dấu là private thì chỉ được truy cập bởi các phương thức của lớp A.

protected

Thành viên trong lớp A được đánh dấu là protected thì chỉ được các phương thức bên trong lớp A và những phương thức dẫn xuất từ lớp A truy cập.

internal

Thành viên trong lớp A được đánh dấu là internal thì được truy cập bởi những phương thức của bất cứ lớp nào trong cùng khối hợp ngữ với A.

protected internal

Thành viên trong lớp A được đánh dấu là protected internal được truy cập bởi các phương thức của lớp A, các phương thức của lớp dẫn xuất của A, và bất cứ lớp nào trong cùng khối hợp ngữ của A.

Mong mun chung là thiết kế các biến thành viên ca lp thuc tính private. Khi đó ch có phương thc thành viên ca lp truy cp đưc giá tr ca biến. C# xem thuc tính private là mc đnh nên trong ví d trên ta không khai báo thuc tính truy cp cho 6 biến nên mc đnh chúng là private, tương t:

 

//Các biến thành viên

private int Nam;

private int Thang;

private int Ngay;

private int Gio;

private int Phut;

private int Giay;

 

Do lp Tester và phương thc thành viên ThoiGianHienHanh ca lp ThoiGian đưc khai báo là public nên bt k lp nào cũng có th truy cp đưc.

Tham số của phương thức

Trong các ngôn ng lp trình thì tham s và đi mc đưc xem là như nhau, cũng tương t khi đang nói v ngôn ngng đi tưng thì ta gi mt hàm là mt phương thc hay hành vi. Tt c các tên này đu tương đng vi nhau.

Mt phương thc có th ly bt k sng tham s nào, các tham s này theo sau bi tên ca phương thc và đưc bao bc bên trong du ngoc tròn (). Mi tham s phi khai báo kèm vi kiu d liu. ví d ta có mt khai báo đnh nghĩa mt phương thc có tên là Method, phương thc không tr v giá tr nào c (khai báo giá tr tr v là void), và có hai tham s là mt kiu int và button:

void Method (int param1, button param2)

{

      //...

}

 

Bên trong thân ca phương thc, các tham s này đưc xem như nhng biến cc b, ging như là ta khai báo biến bên trong phương thc và khi to giá tr bng giá tr ca tham s truyn vào. Ví d sau minh ha vic truyn tham s vào mt phương thc, trong trưng hp này thì hai tham s ca kiu là int và float.

using System;

public class Class1

{

public void SomeMethod(int p1, float p2)

{

Console.WriteLine(“Ham nhan duoc hai tham so: {0} va {1}”, p1,p2);

}

}

public class Tester

{

static void Main()

{

int var1 = 5;

float var2 = 10.5f;

Class1 c = new Class1();

c.SomeMethod(var1, var2 );

}

}

------------------------------------------------------------------

Kết quả:

Ham nhan duoc hai tham so: 5 va 10.5

------------------------------------------------------------------

Phương thc SomeMethod s ly hai tham s int và float ri hin th chúng ta màn hình bng vic dùng hàm Console.WriteLine(). Nhng tham s này có tên là p1 và p2 đưc xem như là biến cc b bên trong ca phương thc.

Trong phương thc gi Main, có hai biến cc b đưc to ra là var1 và var2. Khi hai biến này đưc truyn cho phương thc SomeMethod thì chúng đưc ánh x thành hai tham s p1 và p2 theo th t danh sách biến đưa vào.

2.     Tạo đối tượng

Trong phn trưc đã đ cp đến s khác nhau gia kiu d liu giá tr và kiu d liu tham chiếu. Nhng kiu d liu chun ca C# như int, char, float,… là nhng kiu d liu giá tr, và các biến đưc to ra t các kiu d liu này đưc lưu trên stack. Tuy nhiên, vi các đi tưng kiu d liu tham chiếu thì đưc to ra trên heap, s dng t khóa new đ to mt đi tưng:

      ThoiGian t = new ThoiGian();

t tht s không cha giá tr ca đi tưng ThoiGian, nó ch cha đa ch ca đi tưng đưc to ra trên heap, do vy t ch cha tham chiếu đến mt đi tưng mà thôi.

 

Bộ khởi dựng

Th xem li ví d minh ha trên, câu lnh to mt đi tưng cho lp ThoiGian tương t như vic gi thc hin mt phương thc:

      ThoiGian t = new ThoiGian();

 

Đúng như vy, mt phương thc s đưc gi thc hin khi chúng ta to mt đi tưng. Phương thc này đưc gi là b khi dng (constructor). Các phương thc này đưc đnh nghĩa khi xây dng lp, nếu ta không to ra thì CLR s thay mt chúng ta to phương thc khi dng mt cách mc đnh. Chc năng ca b khi dng là to ra đi tưng đưc xác đnh bi mt lp và đt trng thái này hp l. Trưc khi b khi dng đưc thc hin thì đi tưng chưa đưc cp phát trong b nh. Sau khi b khi dng thc hin hoàn thành thì b nh s lưu gi mt th hin hp l ca lp va khai báo.

Lp ThoiGian trong ví d trên không đnh nghĩa b khi dng. Do không đnh nghĩa nên trình biên dch s cung cp mt b khi dng cho chúng ta. Phương thc khi dng mc đnh đưc to ra cho mt đi tưng s không thc hin bt c hành đng nào, tc là bên trong thân ca phương thc rng. Các biến thành viên đưc khi to các giá tr thưng như thuc tính nguyên có giá tr là 0 và chui thì khi to rng,..Bng 4.2 sau tóm tt các giá tr mc đnh đưc gán cho các kiu d liu cơ bn.

Bảng 1.14. Giá trị mặc định của kiểu dữ liệu cơ bản

Kiểu dữ liệu

Giá trị mặc định

int, long, byte,…

0

bool

false

char

‘\0’ (null)

enum

0

reference

null

 

Thưng thưng, khi mun đnh nghĩa mt phương thc khi dng riêng ta phi cung cp các tham s đ hàm khi dng có th khi to các giá tr khác ngoài giá tr mc đnh cho các đi tưng.

Đ đnh nghĩa mt b khi dng riêng ta phi khai báo mt phương thc có tên ging như tên lp đã khai báo. Phương thc khi dng không có giá tr tr v và đưc khai báo là public. Nếu phương thc khi dng này đưc truyn tham s thì phi khai báo danh sách tham s ging như khai báo vi bt k phương thc nào trong mt lp. Ví d sau minh ha mt b khi dng riêng, phương phc khi dng này s nhn mt tham s là mt đi tưng kiu DateTime do C# cung cp.

Ví dụ: Định nghĩa một bộ khởi dựng.

------------------------------------------------------------------

using System;

public class ThoiGian

{

public void ThoiGianHienHanh()

{

Console.WriteLine(“ Thoi gian hien hanh la : {0}/{1}/{2} {3}:{4}:{5}”, Ngay, Thang, Nam, Gio, Phut, Giay);

}

// Hàm khởi dựng

public ThoiGian( System.DateTime dt )

{

Nam = dt.Year;

Thang = dt.Month;

Ngay = dt.Day;

Gio = dt.Hour;

Phut = dt.Minute;

Giay = dt.Second;

}

//Biến thành viên

private int Nam;

int Thang; int Ngay; int Gio; int Phut; int Giay;

}

public class Tester

{

static void Main()

{

System.DateTime currentTime = System.DateTime.Now; ThoiGian t = new ThoiGian( currentTime ); t.ThoiGianHienHanh();

}

}

------------------------------------------------------------------

Kết quả:

Thoi gian hien hanh la: 5/6/2002   9:10:20

------------------------------------------------------------------

Trong ví d trên phương thc khi dng ly mt đi tưng DateTime và khi to tt c các biến thành viên da trên giá tr ca đi tưng này. Khi phương thc này thc hin xong, mt đi tưng ThoiGian đưc to ra và các biến ca đi tưng cũng đã đưc khi to. Hàm ThoiGianHienHanh đưc gi trong hàm Main() s hin th giá tr thi gian lúc đi tưng đưc to ra.

Chúng ta th b mt s lnh khi to trong phương thc khi dng và cho thc hin chương trình li thì các biến không đưc khi to s có giá tr mc đnh là 0, do là biến nguyên. Mt biến thành viên kiu nguyên s đưc thiết lp giá tr là 0 nếu chúng ta không gán nó trong phương thc khi dng. Chú ý rng kiu d liu giá tr không th không đưc khi to, nếu ta không khi to thì trình biên dch s cung cp các giá tr mc đnh theo bng 4.2.

Ngoài ra trong chương trình 4.3 trên có s dng đi tưng ca lp DateTime, lp DateTime này đưc cung cp bi thư vin System, lp này cũng cung cp các biến thành viên public như: Year, Month, Day, Hour, Minute, và Second tương t như lp ThoiGian ca chúng ta.

Thêm vào đó là lp này có đưa ra mt phương thc thành viên tĩnh tên là Now, phương thc Now s tr v mt tham chiếu đến mt th hin ca mt đi tưng DateTime đưc khi to vi thi gian hin hành.

Theo như trên khi lnh :

      System.DataTime currentTime = System.DateTime.Now();

 

đưc thc hin thì phương thc tĩnh Now() s to ra mt đi tưng DateTime trên b nh heap và tr v mt tham chiếu và tham chiếu này đưc gán cho biến đi tưng currentTime. Sau khi đi tưng currentTime đưc to thì câu lnh tiếp theo s thc hin vic truyn đi tưng currentTime cho phương thc khi dng đ to mt đi tưng ThoiGian:

 

      ThoiGian t = new ThoiGian( currentTime );

 

Bên trong phương thc khi dng này tham s dt s tham chiếu đến đi tưng DateTime là đi tưng va to mà currentTime cũng tham chiếu. Nói cách khác lúc này tham s dt và currentTime cùng tham chiếu đến mt đi tưng DateTime trong b nh. Nh vy phương thc khi dng ThoiGian có th truy cp đưc các biến thành viên public ca đi tưng DateTime đưc to trong hàm Main().

Có mt s nhn mnh đây là đi tưng DateTime đưc truyn cho b dng ThoiGian chính là đi tưng đã đưc to trong hàm Main và là kiu d liu tham chiếu. Do vy khi thc hin truyn tham s là mt kiu d liu tham chiếu thì con tr đưc ánh x qua ch hoàn toàn không có mt đi tưng nào đưc sao chép li.

Khởi tạo biến thành viên

 

Các biến thành viên có th đưc khi to trc tiếp khi khai báo trong quá trình khi to, thay vì phi thc hin vic khi to các biến trong b khi dng. Đ thc hin vic khi to ch vic s dng phép gán giá tr cho mt biến:

 

      private int Giay = 30;      // Khởi tạo

 

Vic khi to biến thành viên s rt có ý nghĩa, vì khi xác đnh giá tr khi to như vy thì biến s không nhn giá tr mc đnh mà trình biên dch cung cp. Khi đó nếu các biến này không đưc gán li trong các phương thc khi dng thì nó s có giá tr mà ta đã khi to. Ví d sau minh ha vic khi to biến thành viên khi khai báo. Trong ví d này s có hai b dng ngoài b dng mc đnh mà trình biên dch cung cp, mt b dng thc hin vic gán giá tr cho tt c các biến thành viên, còn b dng th hai thì cũng tương t nhưng s không gán giá tr cho biến Giay.

 

Ví dụ: Minh hoạ sử dụng khởi tạo biến thành viên.

------------------------------------------------------------------

public class ThoiGian

{

public void ThoiGianHienHanh()

{

System.DateTime now = System.DateTime.Now; System.Console.WriteLine(“\n Hien tai: \t {0}/{1}/{2} {3}:{4}:{5}”,

now.Day, now.Month, now.Year, now.Hour, now.Minute, now.Second); System.Console.WriteLine(“ Thoi Gian:\t {0}/{1}/{2} {3}:{4}:{5}”,

Ngay, Thang, Nam, Gio, Phut, Giay);

}

public ThoiGian( System.DateTime dt)

{

Nam = dt.Year;

Thang = dt.Month;

Ngay = dt.Day;

Gio = dt.Hour;

Phut = dt.Minute;

Giay = dt.Second;     // có gán cho biến thành viên Giay

}

public ThoiGian(int Year, int Month, int Date, int Hour, int Minute)

{

Nam = Year;

Thang = Month;

Ngay = Date;

Gio = Hour;

Phut = Minute;

}

private int Nam;

private int Thang;

private int Ngay;

private int Gio;

private int Phut;

private int Giay = 30 ; // biến được khởi tạo.

}

public class Tester

{

static void Main()

{

System.DateTime currentTime = System.DateTime.Now;

ThoiGian t1 = new ThoiGian(currentTime );

t1.ThoiGianHienHanh();

ThoiGian t2 = new ThoiGian(2001,7,3,10,5);

t2.ThoiGianHienHanh();

}

}

------------------------------------------------------------------

 Kết quả:

Hien tai:

5/6/2002

10:15:5

Thoi Gian:

5/6/2002

10:15:5

Hien

tai:

5/6/2002

10:15:5

Thoi

Gian:

3/7/2001

10:5:30

------------------------------------------------------------------

Nếu không khi to giá tr ca biến thành viên thì b khi dng mc đnh s khi to giá tr là 0 mc đnh cho biến thành viên có kiu nguyên. Tuy nhiên, trong trưng hp này biến thành viên Giay đưc khi to giá tr 30:

 

Giay = 30;   // Khởi tạo

 

Trong trưng hp b khi to th hai không truyn giá tr cho biến Giay nên biến này vn ly giá tr mà ta đã khi to ban đu là 30:

 

ThoiGian t2 = new ThoiGian(2001, 7, 3, 10, 5); t2.ThoiGianHienHanh();

Ngưc li, nếu mt giá tr đưc gán cho biến Giay như trong b khi to th nht thì giá tr mi này s đưc chng lên giá tr khi to.

Trong ví d trên ln đu tiên to đi tưng ThoiGian do ta truyn vào đi tưng DateTime nên hàm khi dng th nht đưc thc hin, hàm này s gán giá tr 5 cho biến Giay. Còn khi to đi tưng ThoiGian th hai, hàm khi dng th hai đưc thc hin, hàm này không gán giá tr cho biến Giay nên biến này vn còn lưu gi li giá tr 30 khi khi to ban đu.

Bộ khởi dựng sao chép

 

B khi dng sao chép thc hin vic to mt đi tưng mi bng cách sao chép tt c các biến t mt đi tưng đã có và cùng mt kiu d liu. Ví d chúng ta mun đưa mt đi tưng ThoiGian vào b khi dng lp ThoiGian đ to mt đi tưng ThoiGian mi có cùng giá tr vi đi tưng ThoiGian cũ. Hai đi tưng này hoàn toàn khác nhau và ch ging nhau giá tr biến thành viên sao khi khi dng.

Ngôn ng C# không cung cp b khi dng sao chép, do đó chúng ta phi t to ra. Vic sao chép các thành phn t mt đi tưng ban đu cho mt đi tưng mi như sau:

public ThoiGian(ThoiGian tg)

{

Nam = tg.Nam;

Thang = tg.Thang;

Ngay = tg.Ngay;

Gio = tg.Gio;

Phut = tg.Phut;

Giay = tg.Giay;

}

 

Khi đó ta có th sao chép t mt đi tưng ThoiGian đã hin hu như sau:

ThoiGian t2 = new ThoiGian( t1 );

 

Trong đó t1 là đi tưng ThoiGian đã tn ti, sau khi lnh trên thc hin xong thì đi tưng t2 đưc to ra như bn sao ca đi tưng t1.

Từ khóa this

T khóa this đưc dùng đ tham chiếu đến th hin hin hành ca mt đi tưng. Tham chiếu this này đưc xem là con tr n đến tt các phương thc không có thuc tính tĩnh trong mt lp. Mi phương thc có th tham chiếu đến nhng phương thc khác và các biến thành viên thông qua tham chiếu this này.

Tham chiếu this này đưc s dng thưng xuyên theo ba cách:

- S dng khi các biến thành viên b che lp bi tham s đưa vào, như trưng hp sau:

 

public void SetYear(int Nam)

{

this.Nam = Nam;

}

 

Như trong đon mã trên phương thc SetYear s thiết lp giá tr ca biến thành viên Nam, tuy nhiên do tham s đưa vào có tên là Nam, trùng vi biến thành viên, nên ta phi dùng tham chiếu this đ xác đnh rõ các biến thành viên và tham s đưc truyn vào. Khi đó this.Nam ch đến biến thành viên ca đi tưng, trong khi Nam ch đến tham s.

- S dng tham chiếu this đ truyn đi tưng hin hành vào mt tham s ca mt phương thc ca đi tưng khác:

public void Method1(OtherClass otherObject)

{

//Sử dụng tham chiếu this để truyền tham số là bản

//thân đối tượng đang thực hiện.

otherObject.SetObject(this);

}

 

Như trên cho thy khi cn truyn mt tham s là chính bn thân ca đi tưng đang thc hin thì ta bt buc phi dùng tham chiếu this đ truyn.

- Cách th ba s dng tham chiếu this là mng ch mc (indexer).

3.     Sử dụng các thành viên tĩnh (static member)

Nhng thuc tính và phương thc trong mt lp có th là nhng thành viên th hin (instance members) hay nhng thành viên tĩnh (static members). Nhng thành viên th hin hay thành viên ca đi tưng liên quan đến th hin ca mt kiu d liu. Trong khi thành viên tĩnh đưc xem như mt phn ca lp. Chúng ta có th truy cp đến thành viên tĩnh ca mt lp thông qua tên lp đã đưc khai báo. Ví d chúng ta có mt lp tên là Button và có hai th hin ca lp tên là btnUpdate và btnDelete. Và gi s lp Button này có mt phương thc tĩnh là Show(). Đ truy cp phương thc tĩnh này ta viết :

      Button.Show();

 

Đúng hơn là viết:

      btnUpdate.Show();

@Ghi chú: Trong ngôn ng C# không cho phép truy cp đến các phương thc tĩnh và các biến thành viên tĩnh thông qua mt th hin, nếu chúng ta c làm điu đó thì trình biên dch C# s báo li, điu này khác vi ngôn ng C++.

Trong mt s ngôn ng thì có s phân chia gia phương thc ca lp và các phương thc khác (toàn cc) tn ti bên ngoài không ph thuc bt c mt lp nào. Tuy nhiên, điu này không cho phép trong C#, ngôn ng C# không cho phép to các phương thc bên ngoài ca lp, nhưng ta có th to đưc các phương thc ging như vy bng cách to các phương thc tĩnh bên trong mt lp.

Phương thc tĩnh hot đng ít nhiu ging như phương thc toàn cc, ta truy cp phương thc này mà không cn phi to bt c th hin hay đi tưng ca lp cha phương thc toàn cc. Tuy nhiên, li ích ca phương thc tĩnh vưt xa phương thc toàn cc vì phương thc tĩnh đưc bao bc trong phm vi ca mt lp nơi nó đưc đnh nghĩa, do vy ta s không gp tình trng ln xn gia các phương thc trùng tên do chúng đưc đt trong namespace.

@Ghi chú: Chúng ta không nên b cám d bi vic to ra mt lp cha toàn b các phương thc linh tinh. Điu này có th tin cho công vic lp trình nhưng s điu không mong mun và gim tính ý nghĩa ca vic thiết kếng đi tưng. Vì đc tính ca vic to các đi tưng là xây dng các phương thc và hành vi xung quanh các thuc tính hay d liu ca đi tưng.

Gọi một phương thức tĩnh

Như chúng ta đã biết phương thc Main() là mt phương thc tĩnh. Phương tĩnh đưc xem như là phn hot đng ca lp hơn là ca th hin mt lp. Chúng cũng không cn có mt tham chiếu this hay bt c th hin nào tham chiếu ti.

Phương thc tĩnh không th truy cp trc tiếp đến các thành viên không có tính cht tĩnh (nonstatic). Như vy Main() không th gi mt phương thc không tĩnh bên trong lp. Ta xem li đon chương trình minh ha:

 

using System;

public class Class1

{

public void SomeMethod(int p1, float p2)

{

Console.WriteLine(“Ham nhan duoc hai tham so: {0} va {1}”, p1,p2);

}

}

public class Tester

{

static void Main()

{

int var1 = 5;

float var2 = 10.5f;

Class1 c = new Class1();

c.SomeMethod( var1, var2 );

}

}

 

Phương thc SomeMethod() là phương thc không tĩnh ca lp Class1, do đó đ truy cp đưc phương thc ca lp này cn phi to mt th hin là mt đi tưng cho lp Class1.

Sử dụng bộ khởi dựng tĩnh

Nếu mt lp khai báo mt b khi to tĩnh (static constructor), thì đưc đm bo rng phương thc khi dng tĩnh này s đưc thc hin trưc bt c th hin nào ca lp đưc to ra.

@Ghi chú: Chúng ta không th điu khin chính xác khi nào thì phương thc khi dng tĩnh đưc thc hin. Tuy nhiên ta biết chc rng nó s đưc thc hin sau khi chương trình chy và trưc bt kì biến đi tưng nào đưc to ra.

Theo ví d trên có th thêm mt b khi dng tĩnh cho lp ThoiGian:

static ThoiGian()

{

      Ten = “Thoi gian”;

}

 

Lưu ý rng đây không có bt c thuc tính truy cp nào như public trưc b khi dng tĩnh. Thuc tính truy cp không cho phép theo sau mt phương thc khi dng tĩnh. Do phương thc tĩnh nên không th truy cp bt c biến thành viên không thuc loi tĩnh, vì vy biến thành viên Name bên trên cũng phi đưc khai báo là tĩnh:

      private static string Ten;

 

Cui cùng ta thêm mt dòng vào phương thc ThoiGianHienHanh() ca lp ThoiGian:

public void ThoiGianHienHanh()

{

System.Console.WriteLine(“ Ten: {0}”, Ten); System.Console.WriteLine(“ Thoi Gian:\t {0}/{1}/{2} {3}:{4}:{5}”, Ngay, Thang, Nam, Gio, Phut, Giay);

}

 

Sau khi thay đi ta biên dch và chy chương trình đưc kết qu sau:

Ten: Thoi Gian

Thoi Gian: 5/6/2002      18:35:20

 

Mc dù chương trình thc hin tt, nhưng không cn thiết phi to ra b khi dng tĩnh đ phc v cho mc đích này. Thay vào đó ta có th dùng chc năng khi to biến thành viên như sau:

 

private static string Ten = “Thoi Gian”;

 

Tuy nhiên, b khi to tĩnh có hu dng khi chúng ta cn cài đt mt s công vic mà không th thc hin đưc thông qua chc năng khi dng và công vic cài đt này ch đưc thc hin duy nht mt ln.

Sử dụng bộ khởi dựng private

 

Như đã nói ngôn ng C# không có phương thc toàn cc và hng s toàn cc. Do vy chúng ta có th to ra nhng lp tin ích nh ch đ cha các phương thc tĩnh. Cách thc hin này luôn có hai mt tt và không tt. Nếu chúng ta to mt lp tin ích như vy và không mun bt c mt th hin nào đưc to ra. Đ ngăn nga vic to bt c th hin ca lp ta to ra b khi dng không có tham s và không làm gì c, tc là bên trong thân ca phương thc rng, và thêm vào đó phương thc này đưc đánh du là private. Do không có b khi dng public, nên không th to ra bt c th hin nào ca lp.

 

Sử dụng các thuộc tính tĩnh

Mt vn đ đt ra là làm sao kim soát đưc s th hin ca mt lp đưc to ra khi thc hin chương trình. Vì hoàn toàn ta không th to đưc biến toàn cc đ làm công vic đếm s th hin ca mt lp.

Thông thưng các biến thành viên tĩnh đưc dùng đ đếm s th hin đã đưc đưc to ra ca mt lp.

4.     Nạp chồng phương thức

Thông thưng khi xây dng các lp, ta có mong mun là to ra nhiu hàm có cùng tên. Cũng như hu hết trong các ví d trưc thì các lp điu có nhiu hơn mt phương thc khi dng. Như trong lp Time có các phương thc khi dng nhn các tham s khác nhau, như tham s là đi tưng DateTime, hay tham s có th đưc tùy chn đ thiết lp các giá tr ca các biến thành viên thông qua các tham s nguyên. Tóm li khi xây dng nhiu các phương thc cùng tên nhưng nhn các tham s khác nhau. Chc năng này đưc gi là np chng phương thc.

Mt ký hiu (signature) ca mt phương thc đưc đnh nghĩa như tên ca phương thc cùng vi danh sách tham s ca phương thc. Hai phương thc khác nhau khi ký hiu ca chúng khác là khác nhau tc là khác nhau khi tên phương thc khác nhau hay danh sách tham s khác nhau. Danh sách tham s đưc xem là khác nhau bi sng các tham s hoc là kiu d liu ca tham s. Ví d đon mã sau, phương thc th nht khác phương thc th hai do sng tham s khác nhau. Phương thc th hai khác phương thc th ba do kiu d liu tham s khác nhau:

void myMethod( int p1 );

void myMethod( int p1, int p2 );

void myMethod( int p1, string p2 );

 

Mt lp có th có bt c sng phương thc nào, nhưng mi phương thc trong lp phi có ký hiu khác vi tt c các phương thc thành viên còn li ca lp.

Đóng gói dữ liệu với thành phần thuộc tính

Thuc tính là khái nim cho phép truy cp trng thái ca lp thay vì thông qua truy cp trc tiếp các biến thành viên, nó s đơc thay thế bng vic thc thi truy cp thông qua phương thc ca lp.

Đây tht s là mt điu lý tưng. Các thành phn bên ngoài (client) mun truy cp trng thái ca mt đi tưng và không mun làm vic vi nhng phương thc. Tuy nhiên, ngưi thiết kế lp mun du trng thái bên trong ca lp mà anh ta xây dng, và cung cp mt cách gián tiếp thông qua mt phương thc.

Thuc tính là mt đc tính mi đưc gii thiu trong ngôn ng C#. Đc tính này cung cp kh năng bo v các trưng d liu bên trong mt lp bng vic đc và viết chúng thông qua thuc tính. Trong ngôn ng khác, điu này có th đưc thc hin thông qua vic to các phương thc ly d liu (getter method) và phương thc thiết lp d liu (setter method).

Thuc tính đưc thiết kế nhm vào hai mc đích: cung cp mt giao din đơn cho phép truy cp các biến thành viên, Tuy nhiên cách thc thc thi truy cp ging như phương thc trong đó các d liu đưc che du, đm bo cho yêu cu thiết kếng đi tưng. Đ hiu rõ đc tính này ta s xem ví d bên dưi:

Ví dụ: Sử dụng thuộc tính.

------------------------------------------------------------------

using System;

public class Time

{

public void DisplayCurrentTime()

{

Console.WriteLine(“Time\t: {0}/{1}/{2} {3}:{4}:{5}”,

date, month, year, hour, minute, second);

}

public Time( System.DateTime dt)

{

year = dt.Year;

month = dt.Month;

date = dt.Day;

hour = dt.Hour;

minute = dt.Minute;

second = dt.Second;

}

public int Hour

{

get

{

return hour;

}

set

{

hour = value;

}

}

//Biến thành viên

private int year; private int month; private int date;

private int hour; private int minute; private int second;

}

public class Tester

{

static void Main()

{

System.DateTime currentTime = System.DateTime.Now;

Time t = new Time( currentTime );

t.DisplayCurrentTime();

// Lấy dữ liệu từ thuộc tính Hour

int theHour = t.Hour;

Console.WriteLine(“ Retrieved the hour: {0}”, theHour);

theHour++;

t.Hour = theHour;

Console.WriteLine(“Updated the hour: {0}”, theHour);

}

}

------------------------------------------------------------------

: Kết quả:

Time  : 2/1/2003 17:55:1

Retrieved the hour: 17

Updated the hour: 18

------------------------------------------------------------------

Đ khai báo thuc tính, đu tiên là khai báo tên thuc tính đ truy cp, tiếp theo là phn thân đnh nghĩa thuc tính nm trong cp du ({}). Bên trong thân ca thuc tính là khai báo hai b truy cp ly và thiết lp d liu:

                     

public int Hour

{

get

{

return hour;

}

set

{

hour = value;

}

}

                     

Mi b truy cp đưc khai báo riêng bit đ làm hai công vic khác nhau là ly hay thiết lp giá tr cho thuc tính. Giá tr thuc tính có th đưc lưu trong cơ s d liu, khi đó trong phn thân ca b truy cp s thc hin các công vic tương tác vi cơ s d lêu. Hoc là giá tr thuc tính đưc lưu tr trong các biến thành viên ca lp như trong ví d:

                     

      private int hour;

 

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

Phn khai báo tương t như mt phương thc ca lp dùng đ tr v mt đi tưng có kiu d liu ca thuc tính. Trong ví d trên, b truy cp ly d liu get ca thuc tính Hour cũng tương t như mt phương thc tr v mt giá tr int. Nó tr v giá tr ca biến thành viên hour nơi mà giá tr ca thuc tính Hour lưu tr:

 

get

{

return hour;

}

 

Trong ví d này, mt biến thành viên cc b đưc tr v, nhưng nó cũng có th truy cp d dàng mt giá tr nguyên t cơ s d lêu, hay thc hin vic tính toán tùy ý.

Bt c khi nào chúng ta tham chiếu đến mt thuc tính hay là gán giá tr thuc tính cho mt biến thì b truy cp ly d liu get s đưc thc hin đ đc giá tr ca thuc tính:

Time t = new Time( currentTime );

int theHour = t.Hour;

 

Khi lnh th hai đưc thc hin thì giá tr ca thuc tính s đưc tr v, tc là b truy cp ly d lêu get s đưc thc hin và kết qu là giá tr ca thuc tính đưc gán cho biến cc b theHour.

 

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

B truy cp này s thiết lp mt giá tr mi cho thuc tính và tương t như mt phương thc tr v mt giá tr void. Khi đnh nghĩa b truy cp thiết lp d lêu chúng ta phi s dng t khóa value đ đi din cho tham s đưc truyn vào và đưc lưu tr bi thuc tính:

 

set

{

hour = value;

}

 

Như đã nói trưc, do ta đang khai báo thuc tính lưu tri dng biến thành viên nên trong phn thân ca b truy cp ta ch s dng biến thành viên mà thôi. B truy cp thiết lp 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 cp nht bt c biến thành viên nào khác ca lp nếu cn thiết.

Khi chúng ta gán mt giá tr cho thuc tính thì b truy cp thiết lp d liu set s đưc t đng thc hin và mt tham s ngm đnh s đưc to ra đ lưu giá tr mà ta mun gán:

theHour++;

t.Hour = theHour;

 

Li ích ca hưng tiếp cn này cho phép các thành phn bên ngoài (client) có th tương tác vi thuc tính mt cách trc tiếp, mà không phi hy sinh vic che du d lêu cũng như đc tính đóng gói d lêu trong thiết kếng đi tưng.