Lập trình OOP với C#

Lập trình OOP với C#. Lập trình hướng đối tượng với C#

Các loại phạm vi truy cập trong Lập trình hướng đối tượng Các loại phạm vi truy cập trong Lập trình hướng đối tượng Các loại phạm vi truy cập trong Lập trình hướng đối tượng Các loại phạm vi truy cập trong Lập trình hướng đối tượng Các loại phạm vi truy cập trong Lập trình hướng đối tượng 5/5 (54 reviews)

Các loại phạm vi truy cập trong Lập trình hướng đối tượng

Đã đăng 2017-03-04 06:23:25 bởi Kteam
5 bình luận 15481 lượt xem
Các loại phạm vi truy cập trong Lập trình hướng đối tượng 5 /5 stars (4 reviews)
 

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về CLASS TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Các loại phạm vi truy cập trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Các loại phạm vi truy cập và ý nghĩa.
  • Phương thức truy vấn, phương thức cập nhật.
  • Từ khoá getset.

Các loại phạm vi truy cập và ý nghĩa

Phạm vi truy cập là cách mà người lập trình quy định về quyền được truy xuất đến các thành phần của lớp.

Trong C# có 5 loại phạm vi truy cập:

Lưu ý:

  • Nếu khai báo lớp mà không chỉ ra phạm vi cụ thể thì phạm vi mặc định là internal.
  • Nếu khai báo thành phần bên trong lớp mà không chỉ ra phạm vi cụ thể thì phạm vị mặc định là private.

Tính đóng gói là 1 trong 4 đặc điểm của lập trình hướng đối tượng (các đặc điểm của lập trình hướng đối tượng đã được trình bày trong bài TỔNG QUAN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ).

Trong tính đóng gói có 2 ý chính:

  • Các dữ liệu và phương thức có liên quan với nhau được đóng gói thành các lớp để tiện cho việc quản lý và sử dụng. Điều này được thể hiện qua cách ta xây dựng 1 class.
  • Đóng gói còn để che giấu một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không thể nhìn thấy. Điều này được thể hiện qua các phạm vi truy cập đã trình bày ở trên. Cụ thể:
    •  Các thuộc tính thường sẽ có phạm vi là private. Vì đây chính là các thông tin nội bộ của lớp không thể để truy cập 1 cách tuỳ tiện được (che giấu thông tin).
    •  Các phương thức thường sẽ có phạm vi là public. Vì đây chính là các hành vi (thao tác) mà lớp hỗ trợ cho chúng ta thực hiện những công việc nhất định nên cần phải cho phép mọi người có thể sử dụng được.

Một ví dụ thực tế về tính đóng gói. Nhà sản xuất chế tạo ra 1 smartphone họ phải đóng gói che giấu đi những mạch điện tử bên trong và chỉ để lộ ra màn hình, khe sạc, cắm tai nghe để giao tiếp.

kteam, howkteamOOP, csharpOOP, get,set, free Education

Ví dụ:   

 /*
        Vì không chỉ định từ khoá cụ thể nên class SinhVien sẽ có phạm vi là internal.
 */

    class SinhVien
    {
        /*
            Các thuộc tính đều mang phạm vi là private. Vì thế chỉ được sử dụng nội bộ trong class
            Ra bên ngoài sẽ không truy cập được.
         */

        private string MASV;
        private string HoTen;
        private double DiemToan;
        private double DiemVan;

        /*
            Phương thức này có phạm vi là public nên có sử dụng từ bên ngoài.
            Và vì phương thức này nằm trong lớp nên có thể sử dụng các thuộc tính private ở trên.
         */

        public void InThongTinDiemTB()
        {
            double DTB = (DiemToan + DiemVan) / 2;
            Console.WriteLine(" Sinh vien " + HoTen + " co diem TB la: " + DTB);
        }
    }

Trong hàm main ta khởi tạo đối tượng thuộc lớp SinhVien xem thế nào.

kteam, howkteam, kteamOOP, C#OOP, CSharpOOP,

Rõ ràng các thuộc tính đều đã ẩn đi và không thể truy cập chỉ còn lại các thành phần public.


Phương thức truy vấn, phương thức cập nhật

Một vấn đề đặt ra là nếu như mọi thuộc tính bên trong lớp đều là private thì khi người dùng bên ngoài muốn xem hoặc thay đổi giá trị thì phải làm sao?

Đến đây đòi hỏi người lập trình phải viết ra 1 cách nào đó để hỗ trợ người dùng làm điều này. Và cách để người dùng có thể xem hoặc thay đổi giá trị cho các thuộc tính bên trong lớp đó chính là thông qua các phương thức truy vấn, phương thức cập nhật.

Phương thức truy vấn là phương thức giúp người dùng có thể xem được dữ liệu của 1 thuộc tính nào đó. Cụ thể, phương thức truy vấn chỉ cần trả về giá trị của thuộc tính tương ứng là đủ.

Phương thức cập nhật là phương thức giúp người dùng có thể thay đổi giá trị cho 1 thuộc tính nào đó. Cụ thể, phương thức cập nhật chỉ cần thực hiện cập nhật giá trị mới cho thuộc tính tương ứng (có thể kiểm tra tính đúng đắn của dữ liệu trước khi truyền vào).

Thực ra, phương thức truy vấn hay phương thức cập nhật chỉ là một phương thức bình thường. Về khai báo và sử dụng hoàn toàn như phương thức bình thường.

Một số quy ước nhỏ về cách đặt tên các phương thức này:

  • Những phương thức truy vấn nên bắt đầu bằng từ khoá get và kèm theo sau là tên thuộc tính tương ứng. Ví dụ: getHoTen(), getDiemToan(), . . .
  • Những phương thức cập nhật nên bắt đầu bằng từ khoá set và kèm theo sau là tên thuộc tính tương ứng. Ví dụ: setDiemToan(), setHoTen(), . . .
  • Nếu thuộc tính kiểu luận lý (bool) thì tên phương thức truy vấn nên bắt đầu bằng từ khoá is và kèm theo sau là tên thuộc tính tương ứng.
  • Phương thức truy vấn sẽ có kiểu trả về trùng với kiểu dữ liệu của thuộc tính tương ứng và không có tham số truyền vào.
  • Phương thức cập nhật sẽ có kiểu trả về là void và có 1 tham số truyền vào có kiểu dữ liệu trùng với kiểu dữ liệu của thuộc tính tương ứng.

Ví dụ:

class SinhVien
    {

        private string MASV;
        private string HoTen;
        private double DiemToan;
        private double DiemVan;

        /*
            Đây là phương thức truy vấn giá trị của thuộc tính MASV
            Vì thế phương thức sẽ trả về string (trùng với kiểu dữ liệu của thuộc tính MASV)
         */
        public string getMASV()
        {
            return MASV;
        }

        /*
            Đây là phương thức cập nhật giá trị cho thuộc tính DiemToan
            Vì thế phương thức có 1 tham số truyền vào kiểu double trùng với kiểu của DiemToan.
         */

        public void setDiemToan(int diemtoan)
        {
            DiemToan = diemtoan;
        }
}

Từ khoá get và set

Trong C#, phương thức truy xuất phương thức cập nhật đã được nâng cấp lên thành 1 cấu trúc mới ngắn gọn hơn và tiện dụng hơn đó là property.

Sử dụng property giúp ta có thể thao tác dữ liệu tự nhiên hơn nhưng vẫn đảm bảo tính đóng gói của lập trình hướng đối tượng.

Cú pháp:

<kiểu dữ liệu> <tên property>

        {

            get { return <tên thuộc tính>; }

            set { <tên thuộc tính> = value; }

        }

Trong đó:

  • <kiểu dữ liệu> là kiểu dữ liệu của property. Thường sẽ trùng với kiểu dữ liệu của thuộc tính private tương ứng bên trong lớp.
  • <tên property> là tên do người dùng đặt và tuân theo quy tắc đặt tên đã trình bày trong bài BIẾN TRONG C#.
  • get, set, value là từ khoá có ý nghĩa:
    •  Từ khoá get tương đương với phương thức truy vấn.
    •  Từ khoá set tương đương với phương thức cập nhật.
    •  Từ khoá value đại diện cho giá trị mà người gán vào property (tương đương với tham số truyền vào của phương thức cập nhật).
  • <tên thuộc tính> là tên thuộc tính thực sự bên trong lớp.

Ví dụ: ta có 1 thuộc tính diemLy cần được đóng gói. Khi đó ta sẽ có 1 property tương ứng để thực hiện điều này:

private double diemLy;
public double DiemLy
{
get { return diemLy; }
set { diemLy = value; }
}

Rõ ràng là mọi thứ trở nên ngắn gọn hơn nhiều.

Khi sử dụng thì ta xem property như một thuộc tính đã được public.

SinhVien SV1 = new SinhVien();

SV1.DiemLy = 8; // khi gán giá trị cho property thì các câu lệnh bên trong set sẽ được thực hiện

Console.WriteLine(" Diem ly: " + SV1.DiemLy); // khi lấy giá trị của property thì các câu lệnh bên trong get sẽ được thực hiện.

Lưu ý:

  • Người ta dùng Property thay cho phương thức truy vấn, phương thức cập nhật vì thế tên property thường phải làm gợi nhớ đến tên thuộc tính private bên trong lớp.
  • Tuỳ theo nhu cầu và tính bảo mật mà người lập trình có thể ngăn không cho gán giá trị hoặc ngăn không cho lấy dữ liệu bằng cách bỏ đi từ khoá tương ứng.

Bạn hoàn toàn có thể viết những kiểm tra nếu muốn vào bên trong get, set.

private double diemLy;
public double DiemLy
{
    get { return diemLy; }
    set
    {
     /*
      Kiểm tra điểm lý có thoả mãn hay không
      Nếu có sẽ thực hiện gán vào thuộc tính private.
      Nếu không sẽ không làm gì cả.
      Điều này nhằm đảm bào tính đúng đắn của dữ liệu.
     */

      if (value <= 10 || value >= 0)
      {
        diemLy = value;
      }
    }
}

Kết luận

Nội dung bài này giúp các bạn nắm được:

  • Các loại phạm vi truy cập và ý nghĩa.
  • Phương thức truy vấn, phương thức cập nhật.
  • Từ khoá getset.

Bài sau chúng ta sẽ tìm hiểu về TỪ KHÓA STATIC TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tài liệu 

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Các loại phạm vi truy cập trong Lập trình hướng đối tượng dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Các loại phạm vi truy cập trong Lập trình hướng đối tượng
MMT 2018-04-13 23:06:50

Tại sao ta không dùng phạm vi truy cập là Public cho thuộc tính luôn thay vì dùng 2 phương thức là Get & Set vậy ad?

0 bình chọn
Reply
Các loại phạm vi truy cập trong Lập trình hướng đối tượng
mr.ms 2017-05-31 16:03:03

Lúc đầu e đọc sơ sơ thấy cũng hơi hiểu hiểu . Sau đó mò mò code được tí rồi lại đọc lại từ đầu .Thì công nhận ngấm từng chữ  một

0 bình chọn
Reply
Các loại phạm vi truy cập trong Lập trình hướng đối tượng
longkk1998 2017-05-26 18:48:27

đã biết được get và set nhưng nó được sử dụng thực tế như thế nào ạ? 

0 bình chọn
Reply
Các loại phạm vi truy cập trong Lập trình hướng đối tượng
longkk1998 2017-05-26 18:36:55

đã biết được get và set nhưng nó được sử dụng thực tế như thế nào ạ? 

0 bình chọn
Reply
View all 1 comments
Kteam - Howkteam Free Education
longkk1998 2017-05-26 18:49:53
mò dần và đã hiểu &lt;3 tks a
0 bình chọn
Reply
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education