Trang chủ > Khác > Học C# > C# - Lớp (Class) (Học C#)

C# - Lớp (Class) (Học C#)

Một định nghĩa lớp trong C# được bắt đầu với từ khóa là class được theo sau bởi tên lớp; và phần thân lớp được bao xung quanh bởi các dấu ngoặc ôm. Sau đây là form chung của một định nghĩa lớp trong C#:

< access specifier> class tên_lớp
{
// các biến thành viên
< access specifier> < kiểu_dữ_liệu> biến1; 
< access specifier> < kiểu_dữ_liệu> biến2; 
... 
< access specifier> < kiểu_dữ_liệu> biếnN; 
// các phương thức thành viên
< access specifier> < kiểu_trả_về> tên_phương_thức1 (danh_sách_tham_số)
{
// phần thân phương thức
}
< access specifier> < kiểu_trả_về> tên_phương_thức2 (danh_sách_tham_số)
{
// phần thân phương thức
}
... 
< access specifier> < kiểu_trả_về> tên_phương_thứcN (danh_sách_tham_số)
{
// phần thân phương thức
}
}

Ghi chú:

  • Access specifier xác định những qui tắc truy cập cho những thành viên cũng như của chính lớp đó. Nếu không được đề cập, thì Access Specifier mặc định cho một kiểu lớp là internal. Chế độ truy cập mặc định cho các thành viên được gọi là private.

  • kiểu_dữ_liệu được xác định là kiểu biến, và khi trả về là kiểu dữ liệu mà phương thức trả về.

  • Để truy cập các thành viên lớp, người dùng cần sử dụng toán tử dot (.).

  • Toán tử dot (.) liên kết với tên của các đối tượng với tên của các thành viên.

Ví dụ dưới đây minh họa các khái niệm về lớp trong C# đã được đề cập ở trên: tạo 2 class có tên lần lượt là TestCsharpBox trong 2 file riêng biệt.

Lớp Box: có chứa một số thuộc tính của một hộp

using System; 
namespace VietJackCsharp
{
class Box
{
public double chieu_dai; 
public double chieu_rong; 
public double chieu_cao; 
}
}

Lớp TestCsharp: có chứa phương thức main () dùng để thao tác trên đối tượng Box

using System; 
namespace VietJackCsharp
{
public class TestCsharp
{
public static void Main (string [] args)
{
Console. WriteLine ("Class trong C#");
Console. WriteLine ("------------------------\n");
Box Box1 = new Box (); // tao doi tuong Box1
Box Box2 = new Box (); // tao doi tuong Box2
double the_tich = 0.0; // the tich cua box
// thong tin cua box1
Box1. chieu_cao = 5.0; 
Box1. chieu_dai = 6.0; 
Box1. chieu_rong = 7.0; 
// thong tin cua box2
Box2. chieu_cao = 10.0; 
Box2. chieu_dai = 12.0; 
Box2. chieu_rong = 13.0; 
// Tinh va in the tich cua box1
the_tich = Box1. chieu_cao * Box1. chieu_dai * Box1. chieu_rong; 
Console. WriteLine ("The tich cua Box1 la: {0}", the_tich);
// Tinh va in the tich cua box2
the_tich = Box2. chieu_cao * Box2. chieu_dai * Box2. chieu_rong; 
Console. WriteLine ("The tich cua Box2 la: {0}", the_tich);
Console. ReadKey (); 
}
}
}

Nếu bạn không dùng lệnh Console. ReadKey (); thì chương trình sẽ chạy và sẽ kết thúc luôn (nhanh quá đến nỗi bạn không thể kịp nhìn kết quả). Lệnh này cho phép chúng ta có thể nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả như dưới đây:

Hàm thành viên và tính đóng gói trong C#

Một hàm thành viên trong C# của một lớp là một hàm mà có định nghĩa và nguyên mẫu (prototype) của nó bên trong định nghĩa lớp tương tự như bất kỳ biến nào khác. Nó hoạt động trên tất cả các đối tượng nào của lớp mà nó là thành viên và có thể truy cập tới tất cả thành viên của một lớp của đối tượng đó.

Những biến thành viên là những thuộc tính của một đối tượng (từ bối cảnh thiết kế) và chúng đã được lưu giữ private để triển khai tính đóng gói. Các biến này chỉ có thể được truy cập thông qua việc dùng các hàm thành viên public.

Ví dụ dưới đây minh họa cách dùng các khái niệm trên để thiết lập và lấy giá trị của những thành viên khác nhau trong một lớp: tạo 2 lớp có tên lần lượt là TestCsharpBox trong 2 file riêng biệt.

Lớp Box: có chứa những thuộc tính và phương thức thành viên

using System; 
namespace VietJackCsharp
{
class Box
{
private double chieu_dai; 
private double chieu_rong; 
private double chieu_cao; 
public void setChieuDai (double len)
{
chieu_dai = len; 
}
public void setChieuRong (double bre)
{
chieu_rong = bre; 
}
public void setChieuCao (double hei)
{
chieu_cao = hei; 
}
public double tinhTheTich ()
{
return chieu_dai * chieu_rong * chieu_cao; 
}
}
}

Lớp TestCsharp: có chứa phương thức main () để thực hiện thao tác trên đối tượng Box

using System; 
namespace VietJackCsharp
{
public class TestCsharp
{
public static void Main (string [] args)
{
Console. WriteLine ("Class trong C#");
Console. WriteLine ("------------------------\n");
Box Box1 = new Box (); // tao doi tuong Box1
Box Box2 = new Box (); // tao doi tuong Box2
double the_tich; 
// nhap thong tin cho Box1
Box1. setChieuDai (6.0); 
Box1. setChieuRong (7.0); 
Box1. setChieuCao (5.0); 
// nhap thong tin cho Box2
Box2. setChieuDai (12.0); 
Box2. setChieuRong (13.0); 
Box2. setChieuCao (10.0); 
// tinh va in the tich Box1
the_tich = Box1. tinhTheTich (); 
Console. WriteLine ("The tich Box1 la: {0}", the_tich);
// tinh va in the tich Box2
the_tich = Box2. tinhTheTich (); 
Console. WriteLine ("The tich Box2 la: {0}", the_tich);
Console. ReadKey (); 
}
}
}

Nếu bạn không dùng lệnh Console. ReadKey (); thì chương trình này sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không có thời gian để kịp nhìn kết quả). Lệnh này sẽ cho phép chúng ta nhìn kết quả một cách đầy đủ và rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả như dưới đây:

Constructor trong C#

Một constructor của một Class, là một hàm thành viên đặc biệt của một lớp, được thực thi bất cứ khi nào người dùng muốn tạo các đối tượng mới của lớp đó.

Một constructor có tên giống như tên lớp và nó sẽ không có bất kỳ một kiểu trả về nào. Sau đây là ví dụ minh họa khái niệm constructor trong C#:

using System; 
namespace VietJackCsharp
{
class Line
{
private double chieu_dai; 
public Line ()
{
Console. WriteLine ("Doi tuong dang duoc tao");
}
public void setChieuDai (double len)
{
chieu_dai = len; 
}
public double getChieuDai ()
{
return chieu_dai; 
}
static void Main (string [] args)
{
Console. WriteLine ("Constructor trong C#");
Console. WriteLine ("---------------------");
//tao doi tuong Line bang constructor
Line line = new Line (); 
// thiet lap chieu dai cho duong
line. setChieuDai (6.0); 
Console. WriteLine ("Chieu dai cua duong la: {0}", line. getChieuDai ());
Console. ReadKey (); 
}
}
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả dưới đây:

Một constructor mặc định trong C# không hề có một tham số nào, nhưng khi bạn cần, một constructor có thể có tham số. Các constructor này còn được gọi là constructor được tham số hóa. Kỹ thuật này hỗ trợ bạn gán giá trị khởi đầu cho một đối tượng tại thời điểm để tạo ra nó, như trong ví dụ dưới đây:

using System; 
namespace VietJackCsharp
{
class Line
{
private double chieu_dai; 
public Line (double len) //constructor co tham so
{
Console. WriteLine ("Doi tuong dang duoc tao, chieu dai = {0}", len);
chieu_dai = len; 
}
public void setChieuDai (double len)
{
chieu_dai = len; 
}
public double getChieuDai ()
{
return chieu_dai; 
}
static void Main (string [] args)
{
Console. WriteLine ("Constructor trong C#");
Console. WriteLine ("---------------------");
//tao doi tuong Line bang constructor
Line line = new Line (10.0); 
Console. WriteLine ("Chieu dai cua duong la: {0}", line. getChieuDai ());
// thiet lap chieu dai cho duong
line. setChieuDai (6.0); 
Console. WriteLine ("Chieu dai cua duong la: {0}", line. getChieuDai ());
Console. ReadKey (); 
}
}
}

Biên dịch và chạy chương trình C# trên sẽ cho ra kết quả như dưới đây:

Destructor trong C#

Một destructor trong C#, là một hàm thành viên đặc biệt trong một lớp, được thực thi bất cứ khi nào mà một đối tượng của lớp đó rời khỏi phạm vi. Một destructor có tên giống với tên lớp với một dẫu ngã (~) ở trước và nó có thể: không trả về bất kỳ một giá trị nào hoặc không nhận bất kỳ một tham số nào.

Destructor trong C# có thể rất hữu ích trong việc giải phóng tài nguyên bộ nhớ trước khi rời khỏi chương trình. Destructor không thể bị nạp chồng hoặc kế thừa.

Ví dụ dưới đây minh họa khái niệm về destructor trong C#:

using System; 
namespace VietJackCsharp
{
class Line
{
private double chieu_dai; 
public Line () //constructor
{
Console. WriteLine ("Doi tuong dang duoc tao. "); 
}
~Line () // destructor
{
Console. WriteLine ("Doi tuong dang bi xoa! !! "); 
}
public void setChieuDai (double len)
{
chieu_dai = len; 
}
public double getChieuDai ()
{
return chieu_dai; 
}
static void Main (string [] args)
{
Console. WriteLine ("Constructor trong C#");
Console. WriteLine ("---------------------");
//tao doi tuong Line bang constructor
Line line = new Line (); 
// thiet lap chieu dai cho duong
line. setChieuDai (6.0); 
Console. WriteLine ("Chieu dai cua duong la: {0}", line. getChieuDai ());
Console. ReadKey (); 
}
}
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả như dưới đây:

Thành viên Static của một Class trong C#

Chúng ta có thể định nghĩa các thành viên lớp là static bởi vì dùng từ khóa static trong C#. Khi chúng ta khai báo một thành viên lớp là static thì cũng có nghĩa là, dù cho có bao nhiêu đối tượng của lớp đó được tạo ra, thì cũng chỉ có duy nhất một bản sao của thành viên static.

Từ khóa static có ngụ ý rằng chỉ có một instance (sự thể hiện) của thành viên tồn tại trong một lớp đó. Những biến static được dùng để định nghĩa các hằng số (constant) bởi vì giá trị của chúng có thể được thu nhận dựa trên việc gọi lớp đó mà không cần phải tạo ra một instance của nó. Những biến static có thể được khởi tạo ở bên ngoài hàm thành viên hoặc định nghĩa lớp. Bạn cũng có thể khởi tạo ra những biến static bên trong định nghĩa lớp.

Ví dụ dưới đây minh họa cách dùng của các biến static trong C#: tạo 2 class có tên lần lượt là TestCsharpThanhVienStatic như sau:

Lớp ThanhVienStatic: có chứa thành viên static và những phương thức

using System; 
namespace VietJackCsharp
{
class ThanhVienStatic
{
public static int num; //thanh vien static
public void count ()
{
num++; 
}
public int getNum ()
{
return num; 
}
}
}

Lớp TestCsharp: có chứa phương thức main () để thực hiện thao tác trên đối tượng ThanhVienStatic này

using System; 
namespace VietJackCsharp
{
public class TestCsharp
{
public static void Main (string [] args)
{
Console. WriteLine ("Thanh vien Static trong C#");
Console. WriteLine ("------------------------\n");
//tao cac doi tuong ThanhVienStatic
ThanhVienStatic s1 = new ThanhVienStatic (); 
ThanhVienStatic s2 = new ThanhVienStatic (); 
//goi phuong thuc count ()
s1. count (); 
s1. count (); 
s1. count (); 
s2. count (); 
s2. count (); 
s2. count (); 
Console. WriteLine ("Gia tri bien num cho doi tuong s1 la: {0}", s1. getNum ());
Console. WriteLine ("Gia tri bien num cho doi tuong s2 la: {0}", s2. getNum ());
Console. ReadKey (); 
}
}
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả như dưới đây:

Bạn cũng có thể khai báo một hàm thành viênstatic. Các hàm này chỉ có thể truy cập vào các biến static. Hàm static có thể tồn tại trước cả khi đối tượng được tạo ra. Ví dụ dưới đây sẽ minh họa cách dùng của hàm static trong C#: ở trên bạn đã tạo ra 2 lớp này rồi, bây giờ chỉ cần thay đổi phần code của 2 lớp một chút như dưới đây:

Lớp ThanhVienStatic: chứa thành viên static và những phương thức static

using System; 
namespace VietJackCsharp
{
class ThanhVienStatic
{
public static int num; // thanh vien static
public void count ()
{
num++; 
}
//phuong thuc static
public static int getNum ()
{
return num; 
}
}
}

Lớp TestCsharp: có chứa phương thức main () để thực hiện thao tác trên đối tượng ThanhVienStatic này

using System; namespace VietJackCsharp { public class TestCsharp { public static void Main (string [] args) { Console. WriteLine ("Phuong thuc Static trong C#"); Console. WriteLine ("------------------------\n"); //tao cac doi tuong ThanhVienStatic ThanhVienStatic s = new ThanhVienStatic (); //goi phuong thuc s. count (); s. count (); s. count (); Console. WriteLine ("Gia tri cua num: {0}", ThanhVienStatic. getNum ()); Console. ReadKey (); } } }