Xem thêm

Định nghĩa một Class trong C

Huy Erick
Khi bạn định nghĩa một lớp (class) trong C#, bạn đang tạo ra một mô hình cho một kiểu dữ liệu. Lớp chỉ là một bản thiết kế, nó không chứa bất kỳ dữ liệu...

Khi bạn định nghĩa một lớp (class) trong C#, bạn đang tạo ra một mô hình cho một kiểu dữ liệu. Lớp chỉ là một bản thiết kế, nó không chứa bất kỳ dữ liệu cụ thể nào. Thay vào đó, nó định nghĩa cấu trúc và các hoạt động mà một đối tượng của lớp đó có thể thực hiện. Đối tượng được tạo ra từ lớp đó được gọi là một instance, hay một sự thể hiện của lớp. Các biến và phương thức trong lớp được gọi là thành viên của lớp.

Định nghĩa một lớp trong C

Một định nghĩa lớp trong C# bắt đầu bằng từ khóa class, theo sau là tên lớp và phần thân lớp được bao quanh bởi cặp dấu ngoặc nhọn. Dưới đây là một ví dụ về cú pháp chung của một định nghĩa lớp trong C#:

<access specifier> class ten_lop  {      // Cac bien thanh vien     <access specifier> <kieu du lieu> bien1;      <access specifier> <kieu du lieu> bien2;      ...      <access specifier> <kieu du lieu> bienN;       // Cac phuong thuc thanh vien     <access specifier> <kieu tra ve> ten_phuong_thuc1(danh_sach_tham_so)      {          // Phan than phuong thuc      }      <access specifier> <kieu tra ve> ten_phuong_thuc2(danh_sach_tham_so)      {          // Phan than phuong thuc      }      ...      <access specifier> <kieu tra ve> ten_phuong_thucN(danh_sach_tham_so)      {          // Phan than phuong thuc      }  }

Ghi chú:

  • Access specifier xác định quyền truy cập cho các thành viên và lớp. Nếu không được chỉ định, access specifier mặc định cho một lớp là internal. Chế độ truy cập mặc định cho các thành viên là private.
  • Kiểu dữ liệu xác định kiểu của biến và kiểu dữ liệu mà phương thức trả về.
  • Để truy cập các thành viên của lớp, bạn sử dụng toán tử dot (.).
  • Toán tử dot (.) kết nối tên của một đối tượng với tên của một thành viên.

Dưới đây là một ví dụ minh họa về các khái niệm về lớp trong C# được đề cập ở trên. Ta sẽ tạo hai lớp có tên là BoxTestCsharp trong hai file riêng biệt.

Lớp Box: chứa các 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: chứa phương thức main() để 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(); // Tạo đối tượng Box1             Box Box2 = new Box(); // Tạo đối tượng Box2             double the_tich = 0.0; // Biến lưu trữ thể tích của hộp              // Thông tin của Box1             Box1.chieu_cao = 5.0;             Box1.chieu_dai = 6.0;             Box1.chieu_rong = 7.0;              // Thông tin của Box2             Box2.chieu_cao = 10.0;             Box2.chieu_dai = 12.0;             Box2.chieu_rong = 13.0;              // Tính và in thể tích của Box1             the_tich = Box1.chieu_cao * Box1.chieu_dai * Box1.chieu_rong;             Console.WriteLine("Thể tích của Box1 là: {0}", the_tich);              // Tính và in thể tích của Box2             the_tich = Box2.chieu_cao * Box2.chieu_dai * Box2.chieu_rong;             Console.WriteLine("Thể tích của Box2 là: {0}", the_tich);              Console.ReadKey();         }     } }

Nếu bạn không sử dụng lệnh Console.ReadKey();, chương trình sẽ chạy và kết thúc ngay lập tức. Lệnh này cho phép bạn nhìn thấy 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ả sau:

Thể tích của Box1 và Box2

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 có định nghĩa và nguyên mẫu 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 bất kỳ đối tượng nào của lớp mà nó là thành viên và có truy cập tới tất cả các thành viên của lớp đó.

Các biến thành viên là các thuộc tính của một đối tượng và chúng được giữ private để triển khai tính đóng gói. Những biến này chỉ có thể được truy cập bằng cách sử dụng các hàm thành viên public.

Dưới đây là một ví dụ minh họa cách sử dụng các khái niệm trên để thiết lập và lấy giá trị của các thành viên khác nhau trong một lớp: ta sẽ tạo hai lớp có tên là BoxTestCsharp trong hai file riêng biệt.

Lớp Box: chứa các 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: chứa phương thức main() để 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(); // Tạo đối tượng Box1             Box Box2 = new Box(); // Tạo đối tượng Box2             double the_tich; // Biến lưu trữ thể tích              // Nhập thông tin cho Box1             Box1.setChieuDai(6.0);             Box1.setChieuRong(7.0);             Box1.setChieuCao(5.0);              // Nhập thông tin cho Box2             Box2.setChieuDai(12.0);             Box2.setChieuRong(13.0);             Box2.setChieuCao(10.0);              // Tính và in thể tích của Box1             the_tich = Box1.tinhTheTich();             Console.WriteLine("Thể tích của Box1 là: {0}", the_tich);              // Tính và in thể tích của Box2             the_tich = Box2.tinhTheTich();             Console.WriteLine("Thể tích của Box2 là: {0}", the_tich);              Console.ReadKey();         }     } }

Nếu bạn không sử dụng lệnh Console.ReadKey();, chương trình sẽ chạy và kết thúc ngay lập tức. Lệnh này cho phép bạn nhìn thấy 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ả sau:

Thể tích của Box1 và Box2

Constructor trong C

Constructor trong C# là một hàm thành viên đặc biệt của một lớp và nó được thực thi mỗi khi chúng ta tạo một đối tượng mới của lớp đó.

Một constructor có tên giống với tên lớp và nó không có kiểu trả về. Dưới đây là một ví dụ minh họa về constructor trong C#:

using System;  namespace VietJackCsharp  {     class Line      {         private double chieu_dai;          public Line()          {             Console.WriteLine("Đối tượng đang được tạo");         }          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("-");              // Tạo đối tượng Line bằng constructor             Line line = new Line();              // Thiết lập chiều dài cho đường line             line.setChieuDai(6.0);             Console.WriteLine("Chiều dài của đường là: {0}", line.getChieuDai());              Console.ReadKey();         }     } }

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

Constructor trong C#

Destructor trong C

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

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

Dưới đây là một ví dụ về destructor trong C#:

using System;  namespace VietJackCsharp  {     class Line      {         private double chieu_dai;          public Line() // Constructor         {             Console.WriteLine("Đối tượng đang được tạo.");         }          ~Line() // Destructor         {             Console.WriteLine("Đối tượng đang bị xóa!!!");         }          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("-");              // Tạo đối tượng Line bằng constructor             Line line = new Line();              // Thiết lập chiều dài cho đường line             line.setChieuDai(6.0);             Console.WriteLine("Chiều dài của đường là: {0}", line.getChieuDai());              Console.ReadKey();         }     } }

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

Destructor trong C#

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ằng cách sử 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, nghĩa là chỉ có một bản sao của thành viên static cho mỗi lớp đó.

Từ khóa static ngụ ý rằng chỉ có một instance của thành viên tồn tại cho một lớp. Các biến static được sử dụng để định nghĩa các hằng số bởi vì giá trị của chúng có thể được truy cập mà không cần tạo một instance của lớp. Các 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 các biến static bên trong định nghĩa lớp.

Dưới đây là một ví dụ minh họa về việc sử dụng các biến static trong C#: ta sẽ tạo hai lớp có tên là ThanhVienStaticTestCsharp như sau:

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

using System;  namespace VietJackCsharp  {     class ThanhVienStatic      {         public static int num; // thành viên static          public void count()          {             num++;         }          public int getNum()          {             return num;         }     } }

Lớp TestCsharp: chứa phương thức main() để 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("Thành viên Static trong C#");             Console.WriteLine("-n");              // Tạo các đối tượng ThanhVienStatic             ThanhVienStatic s1 = new ThanhVienStatic();             ThanhVienStatic s2 = new ThanhVienStatic();              // Gọi phương thức count()             s1.count();             s1.count();             s1.count();             s2.count();             s2.count();             s2.count();              Console.WriteLine("Giá trị biến num cho đối tượng s1 là: {0}", s1.getNum());             Console.WriteLine("Giá trị biến num cho đối tượng s2 là: {0}", s2.getNum());              Console.ReadKey();         }     } }

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

Giá trị num của s1 và s2

Bạn cũng có thể khai báo một hàm thành viên là static. Những hàm này chỉ có thể truy cập các biến static của lớp. Hàm static có thể tồn tại trước cả khi đối tượng được tạo. Dưới đây là một ví dụ minh họa về việc sử dụng hàm static trong C#: tiếp tục từ ví dụ trên, ta chỉ cần thay đổi phần code của hai lớp một chút như sau:

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

using System;  namespace VietJackCsharp  {     class ThanhVienStatic      {         public static int num; // thành viên static          public void count()          {             num++;         }          public static int getNum()          {             return num;         }     } }

Lớp TestCsharp: chứa phương thức main() để 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("Phương thức Static trong C#");             Console.WriteLine("-n");              // Tạo đối tượng ThanhVienStatic             ThanhVienStatic s = new ThanhVienStatic();              // Gọi phương thức             s.count();             s.count();             s.count();              Console.WriteLine("Giá trị của num: {0}", ThanhVienStatic.getNum());              Console.ReadKey();         }     } }

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

Giá trị num sau khi increment

1