Lập trình hướng đối tượng trong c# (phần 2)
Ở đơn vị bài hôm nay, ta cùng tìm hiểu về các thành viên tĩnh trong hướng đối tượng.
Sử dụng các thành viên tĩnh
Bình thường, các thuộc tính, phương thức sẽ có đặc điểm:
- Chỉ có thể sử dụng sau khi khởi tạo đối tượng.
- Dữ liệu thuộc về riêng mỗi đối tượng ( xét cùng một thuộc tính, các đối tượng khác nhau thì thuộc tính đó sẽ mang các giá trị khác nhau ).
- Được gọi thông qua tên của đối tượng.
Nhưng đôi lúc người lập trình muốn 1 thuộc tính nào đó được dùng chung cho mọi đối tượng (chi được cấp phát một vùng nhớ duy nhất), từ đó khái niệm thành viên tĩnh ra đời.
Đặc điểm của thành viên tĩnh:
- Được khởi tạo một lần duy nhất, ngay khi biên dịch chương trình.
- Có thể dùng chung cho mọi đối tượng .
- Được gọi thông qua tên lớp.
- Được hủy khi kết thúc chương trình.
Có 4 loại thành viên tĩnh chính:
+ Biến tĩnh ( static variable).
+ Phương thức tĩnh ( static method) .
+ Lớp tĩnh ( static class).
+ Phương thức khởi tạo tĩnh ( static constructor).
Để khai báo một thành viên tĩnh ta sử dụng từ khóa static đặt trước tên biến, tên phương thức, tên class.
Biến tĩnh
Cú pháp:
<phạm_vi_truy_cập> static < kiểu_dữ_liệu> <tên_biến> = <giá_trị_khởi_tạo>;
trong đó:
- Phạm_vi_truy_cập: các phạm vi đã trình bày ở bài trước Lập trình hướng đối tượng trong c# (phần 1)
- Static là từ khóa để khai thành viên tĩnh.
- Giá_trị_khởi_tạo là giá trị ban đầu mà biến tĩnh này chứa, nếu bạn không khai báo giá trị này thì C# sẽ tự tự gán giá trị mặc định và đưa ra một lời cảnh báo khi bạn biên dịch chương trình.
Có thể hiểu biến tĩnh là :
+ Một đối tượng dùng chung cho mọi đối tượng thuộc lớp.
+ Nó được khởi tạo vùng nhớ một lần duy nhất ngay khi chương trình được nạp vào bộ nhớ để thực thi và hủy khi kết thúc chương trình.
- Ngoài biến tĩnh ra thì hằng số cũng có thể được gọi thông qua tên lớp và không cần khởi tạo đối tượng nhưng biến tĩnh linh hoạt hơn, đó là có thể thay đổi giá trị khi cần thiết
- Về cách sử dụng thì thao tác hoàn toàn như 1 biến bình thường chỉ cần lưu ý là phải gọi biến này thông qua tên lớp .
Ví dụ:
namespace ConsoleApplication3
{
class cat{
private int weight;
public int Weight
{
get{return weight;}
set{value = weight;}
}
private int height;
public int Height
{
get{return height;}
set{value = height;}
}
/* khai báo một biến static tên count để chứa số lượng mèo hiện tại
Mỗi lần có đối tượng tạo ra thì tăng count lên*/
public static int count = 0;
public cat()
{
weight= 100;
height=500;
/* vì construcor được gọi khi đối tượng được tạo ra nên ta sẽ tăng count ở đây */
count ++;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("So luong meo ban dau:{0} ", cat.count);
cat blackcat = new cat();
Console.WriteLine("So luong meo thu 1: {0} ", cat.count);
cat whitecat = new cat();
Console.WriteLine("So luong meo thu 2:{0} ", cat.count);
Console.ReadKey();
}
}
}
Kết quả hiển thị ra là:
Lí do: count là 1 biến tĩnh, bạn có khởi tạo bao nhiêu con mèo ( cat) thì cũng không liên quan đến thằng count này, nó cũng không bị reset lại. Bộ nhớ chỉ tạo 1 lần count và hủy sau khi biên dịch xong.
- Giá_trị_khởi_tạo là giá trị ban đầu mà biến tĩnh này chứa, nếu bạn không khai báo giá trị này thì C# sẽ tự tự gán giá trị mặc định và đưa ra một lời cảnh báo khi bạn biên dịch chương trình.
Có thể hiểu biến tĩnh là :
+ Một đối tượng dùng chung cho mọi đối tượng thuộc lớp.
+ Nó được khởi tạo vùng nhớ một lần duy nhất ngay khi chương trình được nạp vào bộ nhớ để thực thi và hủy khi kết thúc chương trình.
- Ngoài biến tĩnh ra thì hằng số cũng có thể được gọi thông qua tên lớp và không cần khởi tạo đối tượng nhưng biến tĩnh linh hoạt hơn, đó là có thể thay đổi giá trị khi cần thiết
- Về cách sử dụng thì thao tác hoàn toàn như 1 biến bình thường chỉ cần lưu ý là phải gọi biến này thông qua tên lớp .
Ví dụ:
namespace ConsoleApplication3
{
class cat{
private int weight;
public int Weight
{
get{return weight;}
set{value = weight;}
}
private int height;
public int Height
{
get{return height;}
set{value = height;}
}
/* khai báo một biến static tên count để chứa số lượng mèo hiện tại
Mỗi lần có đối tượng tạo ra thì tăng count lên*/
public static int count = 0;
public cat()
{
weight= 100;
height=500;
/* vì construcor được gọi khi đối tượng được tạo ra nên ta sẽ tăng count ở đây */
count ++;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("So luong meo ban dau:{0} ", cat.count);
cat blackcat = new cat();
Console.WriteLine("So luong meo thu 1: {0} ", cat.count);
cat whitecat = new cat();
Console.WriteLine("So luong meo thu 2:{0} ", cat.count);
Console.ReadKey();
}
}
}
Kết quả hiển thị ra là:
Lí do: count là 1 biến tĩnh, bạn có khởi tạo bao nhiêu con mèo ( cat) thì cũng không liên quan đến thằng count này, nó cũng không bị reset lại. Bộ nhớ chỉ tạo 1 lần count và hủy sau khi biên dịch xong.
Phương thức tĩnh
Cú pháp:
<phạm_vi_truy_cập> static <kiểu_trả _về> <tên_phương_thức>
{
// nội dung phương thức.
}
- Phạm_vi_truy_cập: các phạm vi đã trình bày ở bài trước Lập trình hướng đối tượng trong c# (phần 1)
- Static là từ khóa để khai thành viên tĩnh.
- kiểu_trả _về : là kiểu trả về của phương thức.
- tên_phương_thức: Là tên do người dùng đặt và tuân thủ các quy tắc đặt tên đã trình bày ở bài Lập trình hướng đối tượng trong c# (phần 1)
Hàm tĩnh được sử dụng với 2 mục đích chính:
- Hàm tĩnh là một hàm dùng chung của lớp, được gọi thông qua tên lớp và không cần khởi tạo bất kì đối tượng nào, từ đó tránh việc lãng phí bộ nhớ.
- Hỗ trợ trong việc viết các hàm tiện ích để sử dụng lại.
- Về sử dụng, ta cũng thao tác hoàn toàn như một phương thức bình thường, chỉ cần lưu ý là gọi phương thức này thông qua tên lớp
Ví dụ:
namespace ConsoleApplication3
{
static class tienich
{
public static long luythua(int coso, int somu)
{
long ketqua = 1;
for (int i = 0; i < somu; i++)
ketqua *= coso;
return ketqua;
}
}
class Program
{
static void Main(string[] args)
{
/* gọi phương thức thông qua tên lớp và không cần khởi tạo đối tượng */
Console.WriteLine("ket qua bang: {0}", tienich.luythua(3,3));
Console.ReadKey();
}
}
}
kết quả ta có :
- kiểu_trả _về : là kiểu trả về của phương thức.
- tên_phương_thức: Là tên do người dùng đặt và tuân thủ các quy tắc đặt tên đã trình bày ở bài Lập trình hướng đối tượng trong c# (phần 1)
Hàm tĩnh được sử dụng với 2 mục đích chính:
- Hàm tĩnh là một hàm dùng chung của lớp, được gọi thông qua tên lớp và không cần khởi tạo bất kì đối tượng nào, từ đó tránh việc lãng phí bộ nhớ.
- Hỗ trợ trong việc viết các hàm tiện ích để sử dụng lại.
- Về sử dụng, ta cũng thao tác hoàn toàn như một phương thức bình thường, chỉ cần lưu ý là gọi phương thức này thông qua tên lớp
Ví dụ:
namespace ConsoleApplication3
{
static class tienich
{
public static long luythua(int coso, int somu)
{
long ketqua = 1;
for (int i = 0; i < somu; i++)
ketqua *= coso;
return ketqua;
}
}
class Program
{
static void Main(string[] args)
{
/* gọi phương thức thông qua tên lớp và không cần khởi tạo đối tượng */
Console.ReadKey();
}
}
}
kết quả ta có :
Điều này giúp tiết kiệm thời gian, tránh các đoạn code trở nên rườm rà. Thay vì bạn phải tạo ra 1 đối tượng tiện ích mới sau đó mới gọi phương thức thì chỉ cần sử dụng static nó sẽ gọi phương thức ở bất cứ đâu chỉ cần có tên lớp.
Lớp tĩnh
Cú pháp:
<phạm_vi_truy_cập> static <tên_lớp>
{
// nội dung phương thức.
}
Các phần trong cú pháp khá quen thuộc rồi, mình không nhắc lại nữa.
Lớp tĩnh có các đặc điểm sau:
- Chỉ chứa các thành phần tĩnh ( biến tĩnh, phương thức tĩnh).
- Không thể khai báo, khởi tạo một đối tượng thuộc lớp tĩnh.
Với hai đặc điểm trên thì có thể thấy lớp tĩnh thường được dùng với mục đích khai báo một lớp tiện ích chứa cá hàm tiện ích hoặc hằng số vì:
+ Ràng buộc các thành phần bên trong lớp phải là static.
+ Không cho phép tạo ra các đối tượng dư thừa làm lãng phí bộ nhớ.
+ Mọi thứ đều được truy cập thông qua tên lớp.
Phương thức khởi tạo tĩnh
Cú pháp:
static <tên_lớp>()
{
// nội dung của constructor.
}
static : Từ khóa để khai báo thành viên tĩnh.
Tên_lớp: tên của lớp chứa constructor này.
Đặc điểm:
- Không được phép khai báo phạm vi truy cập.Nếu cố tình làm điều này c# sẽ báo lỗi khi biên dịch.
- Constructor tĩnh sẽ được gọi một lần duy nhất khi chương trình được nạp vào bộ nhớ để thực thi như là một cách để ta thiết lập một số thông số theo ý muốn trước khi có bất kì đối tượng nào được tạo ra.
- Constructor tĩnh cũng giống như phương thức tĩnh nên không thể gọi các thuộc tính không phải static.



Nhận xét
Đăng nhận xét