Mất 7 phút đọc

Xây dựng Lớp và các thành phần của Lớp

Nội dung

  • Cách tạo Lớp và các quy tắc
  • Các mức truy xuất
  • Các thành phần của lớp
  • Thuộc tính, phương thức
  • Operator
  • Service Method và Support Method
  • Overloading method
  • Parameter list method
  • Alias và cơ chế gom rác tự động

Định nghĩa Lớp

Quy tắc đặt tên Lớp trong C#

  • Tên lớp nên là một danh từ
  • Tên lớp có thể gồm nhiều từ, ký tự đầu tiên của mỗi từ nên viết hoa
  • Tên lớp nên đặt đơn giản, dễ nhớ, và có ý nghĩa
  • Tên lớp không được trùng với từ khóa của c#
  • Tên lớp không thể bắt đầu bằng số.

Trong một dự án thực tế làm sao xác định được các Lớp, các đối tượng, thuộc tính và phương thức của đối tượng?

class TenLop
{
//khai báo biến lớp
kieubien tenBien1;
kieubien tenBien2;

//khai báo phương thức
PhuongThuc1();
PhuongThuc2();
}

Định nghĩa lớp Phân Số:

class PhanSo
{
//khai báo biến lớp
int tuSo;
int mauSo;

//khai báo phương thức

}

Không cần khai báo thuộc tính, sử dụng trực tiếp Properties:

public class PhanSo
{
public int TuSo
{
get;
set;
}
public int MauSo
{
get;
set;
}
public override string ToString()
{
return this.TuSo+”/”+this.MauSo;
}
}

Khởi tạo đối tượng

TenLop tenBien = new TenLop();

Ví dụ:

  • PhanSo psA = new PhanSo();
  • XeHoi xeHoiB = new XeHoi();

Từ khóa new dùng để cấp phát bộ nhớ cho đối tượng. psA và xeHoiB là 2 biến đối tượng trỏ tới 2 vùng nhớ được cấp phát trong thanh RAM.

Mức truy suất

public

  • Có thể truy xuất ở mọi nơi khác

private

  • Chỉ có thể truy xuất ở trong class

protected

  • Chỉ có thể truy xuất ở trong class hoặc class kế thừa

Biến Lớp

Lưu trữ tình trạng của đối tượng

Sử dụng cách khai báo biến thông thường

Thêm mức truy xuất

Ví dụ

  • public int tuSo;
  • private int mauSo
  • protected int soBanhXe;

Truy xuất biến lớp:

  • tenDoiTuong.bienLop

Phương thức (Method)

Các hàm bên trong lớp

Mô tả hoạt động của đối tượng

Thêm mức truy xuất khi khai báo

Truy xuất phương thức

  • tenBien.TenPhuongThuc();

Ví dụ:

  • PhanSo a = new PhanSo();
  • a.ToiGian();
  • PhanSo b = a.NhanMotSo(2);

static

Dùng cho các thành phần lớp không phụ thuộc vào đối tượng cụ thể

Có thể truy cập trong bản thân lớp

Được truy cập trực tiếp từ tên lớp

Phương thức static chỉ truy cập được những thành viên static của lớp

Truy cập:

  • TenLop.TenBien
  • TenLop.TenPhuongThuc()

Có thể hiểu static là ô nhớ chia sẻ chung, khi biến static thay đổi giá trị thì toàn bộ các đối tượng đều thấy sự thay đổi này.

Hàm khởi tạo (Constructor)

Khởi tạo giá trị ban đầu cho đối tượng khi khai báo

Cùng tên với tên lớp

Không khai báo kiểu trả về

Khai báo:

class TenLop
{
public TenLop()
{

}
}

Constructor mặc định

Là constructor không có tham số và không thực hiện lệnh gì cả (hoặc thực hiện một số lệnh khởi tạo mặc định theo chủ ý của Lập trình viên)

Nếu không khai báo constructor thì trình biên dịch sẽ tự thêm constructor mặc định.

Một lớp có thể có nhiều constructor

Các constructor khác nhau về tham số

  • Số tham số
  • Kiểu tham số

Đối tượng được khởi tạo theo constructor tương ứng khi khai báo

Chú ý: Khi khai báo constructor khác, constructor mặc định sẽ không có. Nếu muốn sử dụng thì phải khai báo lại.

class PhanSo
{
//khai báo biến lớp
private int tuSo;
private int mauSo;

public PhanSo()
{
tuSo = 0;
mauSo = 1;
}

public PhanSo(int ts, int ms)
{
tuSo = ts;
mauSo = ms;
}
}

Khởi tạo đối tượng phân số có tử số = 0, mẫu số = 1:

  • PhanSo a = new PhanSo();
  • PhanSo b = new PhanSo(0, 1);

Khởi tạo đối tượng phân số có tử số = 1, mẫu số = 2:

PhanSo c = new PhanSo(1, 2)

Tham chiếu this

Tham khảo đến đối tượng hiện hành.

Trong trường hợp đặt tên tham số trùng với tên biến lớp, sử dụng this để chỉ biến lớp.

class PhanSo
{
private int tuSo;
private int mauSo;

public PhanSo(int tuSo, int mauSo)
{
this.tuSo = tuSo;
this.mauSo = mauSo;
}
}

Truyền đối tượng vào phương thức

Đối tượng là kiểu tham chiếu

Nếu có câu lệnh tác động đến giá trị các biến lớp của đối tượng trong phương thức à đối tượng bị thay đổi sau khi hoàn tất phương thức.

Bảo vệ truy cập biến lớp

Thay đổi tên biến ->  thay đổi code ở những chỗ dùng biến?

Hạn chế người dùng thay đổi giá trị biến?

Kiểm tra hợp lệ khi gán giá trị biến?

Biến chỉ đọc (read only)?

Truy cập giá trị là kết quả của việc xử lý các biến lớp?

  • -> Không cho phép truy cập biến lớp
  • -> Dùng hàm để truy cập

class PhanSo
{
private int tuSo;
public int mauSo;

public int LayTuSo()
{
return tuSo;
}
public void GanTuSo(int gt)
{
tuSo = gt;
}
}

Thuộc tính

Dùng để bảo vệ việc truy cập biến lớp

Cho phép chỉnh sửa code không làm ảnh hưởng nhiều đến chương trình.

class PhanSo
{
private int tuSo;
private int mauSo;
public int TuSo
{
get { return tuSo; }
set { tuSo = value; }
}
public int MauSo
{
get { return mauSo; }
set { mauSo = value; }
}
}

Kiểm tra hợp lệ

class PhanSo
{
private int tuSo;
private int mauSo;
public int TuSo { … }
public int MauSo
{
get { return mauSo; }
set
{
if(value == 0)
mauSo = 1;
else
mauSo = value;
}
}
}

Thuộc tính chỉ đọc

Không cho người dùng sửa giá trị biến

Chỉ có get, không có set

class PhanSo
{
private int tuSo;
private int mauSo;
private double giaTri;
public double GiaTri
{
get { return giaTri; }
}
public double LayGiaTri()
{
giaTri = (double)tuSo / (double)mauSo;
return giaTri;
}
}

Thuộc tính là kết quả xử lý

class PhanSo
{
private int tuSo;
private int mauSo;
private double giaTri;
public int TuSo{…}
public int MauSo{…}

public double GiaTri
{
get { return (double)tuSo / (double)mauSo; }
}
}

Toán tử

Các phép tính +, -, *, /

Phép so sánh >, <, >=, <=

Các kiểu xây dựng sẵn (int, string, double…) sử dụng được toán tử.

-> Các kiểu do người dùng tạo cũng cần toán tử

  • Ví dụ:
  • Phân số
  • Số La Mã

Thực hiện bằng Hàm

Xây dựng hàm để thực hiện tính toán

class PhanSo
{
private int tuSo;
private int mauSo;
public PhanSo Cong(PhanSo b)
{
PhanSo c = new PhanSo();
c.TuSo = this.MauSo * b.TuSo + this.TuSo * b.MauSo;
c.MauSo = this.MauSo * b.MauSo;
return c;
}
}

Sử dụng toán tử

public static PhanSo operator +(PhanSo trai, PhanSo phai)
{
PhanSo c = new PhanSo();
c.TuSo = trai.MauSo * phai.TuSo
+ trai.TuSo * phai.MauSo;
c.MauSo = trai.MauSo * phai.MauSo;
return c;
}

Các toán tử logic phải đi đôi với nhau

  • ><
  • >=<=
  • ==!=

Lưu ý

Sử dụng toán tử đúng chỗ, hợp lý

Nên sử dụng đúng ý nghĩa toán tử (toán tử + thì nên là phép cộng)

Sử dụng toán tử để thực hiện công việc đơn giản

Service Method và Support Method

Một lớp có nhiều phương thức, có những phương thức cung cấp ra ngoài cho các đối tượng khác sử dụng (public, gọi là Service method), có phương phức chỉ sử dụng trong lớp (private, gọi là Support Method).

Các support method sẽ bổ trợ cho Service method.

public class TamGiac
{
public int CanhA { get; set; }
public int CanhB { get; set; }
public int CanhC { get; set; }
private bool laHopLe() {
if (CanhA > 0 && CanhB > 0 && CanhC > 0 &&
(CanhA + CanhB) > CanhC &&
(CanhB + CanhC) > CanhA &&
(CanhA + CanhC) > CanhB)
return true;
return false;
}
public int ChuVi() {
if (laHopLe() == false)
return -1;
return CanhA + CanhB + CanhC;
}
}

Overloading Method

Overloading Method:

  • Là đặc điểm trong cùng 1 lớp có nhiều phương thức cùng tên nhưng khác nhau về Signature.
  • Signature bao gồm: Số lượng các đối số hoặc kiểu dữ liệu các đối số hoặc thứ tự các đối số.
  • Kiểu dữ liệu trả về không được tính vào signature
  • Lợi ích của Overloading là khả năng tái sử dụng lại phương thức và giúp việc gọi hàm “uyển chuyển”.
  • Các Constructor là trường hợp đặc biệt của Overloading Method

Parameter List Method

C# cung cấp một loại phương thức đặc biệt đó là Parameter List, cũng là một trường hợp đặc biệt của Overloading Method.

Ta có thể truyền bao nhiêu đối số kiểu int vào cho phương thức Sum cũng được.

Alias và cơ chế gom rác tự động

Alias là đặc điểm mà trên một ô nhớ có nhiều biến đối tượng cùng trỏ tới.

Ví dụ:

  • PhanSo psA=new PhanSo(1,5);
  • PhanSo psB=new PhanSo(3,7);

Lúc này trên thanh RAM sẽ có 2 ô nhớ cấp phát cho 2 đối tượng phân số được quản lý bởi 2 biến đối tượng psA và psB

Giả sử ta thực hiện lệnh:

psA=psB;

-> Ngôn ngữ nói “Phân số A bằng Phân số B”, nhưng hệ thống máy tính sẽ làm việc theo cơ chế “Phân số A trỏ tới vùng nhớ mà phân số B đang quản lý”. Hay nói cách khác “Vùng nhớ B” bây giờ có 2 biến đối tượng cùng trỏ tới(cùng quản lý).

Như vậy đã xuất hiện Alias ở “vùng nhớ B”. Lúc này sẽ xảy ra 2 hiện tượng như sau:

Tại “vùng nhớ B”, nếu psA thay đổi thông tin sẽ làm cho psB thay đổi thông tin (vì cả 2 đối tượng này cùng quản lý một vùng nhớ)

“Vùng nhớ A” không còn đối tượng nào tham chiếu tới, lúc này hệ thống sẽ tự động thu hồi bộ nhớ (hủy vùng nhớ A đã cấp trước đó), cơ chế này gọi là cơ chế gom rác tự động

Đôi khi trong quá trình thực hiện phần mềm ta có nhu cầu sao chép đối tượng ra (tạo thêm một đối tượng giống y xì đối tượng cũ nhưng nằm ở ô nhớ khác, để ta có thể tự do thay đổi thông tin trên đối tượng sao chép mà không làm ảnh hưởng tới đối tượng gốc). C# hỗ trợ chúng ta hàm MemberwiseClone để sao chép đối tượng.

public PhanSo copy()
{
return this.MemberwiseClone() as PhanSo;
}

Ví dụ:

psA thay đổi không ảnh hưởng gì tới psB và ngược lại

5/5 - (1 Bình chọn)
600 lượt xem

21/03/2022 Ứng Dụng Miễn Phí

Bài viết liên quan

Block "5_tab_footer" not found