Tính đóng gói trong C#



Encapsulation (Tính đóng gói) được định nghĩa là "tiến trình đóng gói một hoặc nhiều mục bên trong một gói logic hoặc vật lý". Tính đóng gói, trong phương pháp lập trình hướng đối tượng, ngăn cản việc truy cập tới chi tiết của trình trình triển khai (Implementation Detail).

Tính trừu tượng và tính đóng gói là hai đặc điểm có liên quan với nhau trong lập trình hướng đối tượng. Tính trừu tượng cho phép tạo các thông tin liên quan có thể nhìn thấy và tính đóng gói cho lập trình viên khả năng triển khai độ trừu tượng đã được kế thừa.

Tính đóng gói được triển khai bởi sử dụng Access Specifier. Một Access Specifier định nghĩa phạm vi và tính nhìn thấy của một thành viên lớp. C# hỗ trợ các Access Specifier sau:

  • Public
  • Private
  • Protected
  • Internal
  • Protected internal

Public Access Specifier trong C#

Public Access Specifier trong C# cho phép một lớp trưng bày các biến thành viên và các hàm thành viên của nó tới các hàm và đối tượng khác. Bất kỳ thành viên public nào trong C# có thể được truy cập từ bên ngoài lớp đó.

Ví dụ sau minh họa Public Access Specifier trong C#:

Để minh họa rõ ràng tính đóng gói trong C#, mình tạo hai lớp có tên lần lượt là: RectangleExecuteRectangle.

Lớp Rectangle: chứa các thuộc tính, phương thức

using System;

namespace VietJackCsharp
{
    class Rectangle
    {
        //cac bien thanh vien
        public double length;
        public double width;

        //cac phuong thuc
        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Chieu dai: {0}", length);
            Console.WriteLine("Chieu rong: {0}", width);
            Console.WriteLine("Dien tich: {0}", GetArea());
        }
    }
}

Lớp ExecuteRectangle: chứa phương thức main() để thao tác trên đối tượng Rectangle

using System;

namespace VietJackCsharp
{
    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Tinh dong goi trong C#");
            Console.WriteLine("-------------------------------");

            //tao doi tuong Rectangle
            Rectangle r = new Rectangle();
            //thiet lap cac thuoc tinh
            r.length = 4.5;
            r.width = 3.5;
            //goi phuong thuc
            r.Display();
            Console.ReadLine();

            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta 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ả sau:

Tính đóng gói trong C#

Trong ví dụ, các biến thành viên length và width được khai báo là public, vì thế chúng có thể được truy cập từ hàm Main() bởi sử dụng một Instance (một sự thể hiện) của lớp Rectangle, tên là r.

Hàm thành viên Display()GetArea() cũng có thể truy cập các biến này một cách trực tiếp mà không cần sử dụng bất kỳ instance nào của lớp.

Hàm thành viên Display() cũng được khai báo là public, vì thế nó cũng có thể được truy cập từ hàm Main() bởi sử dụng một Instance (một sự thể hiện) của lớp Rectangle, tên là r.

Private Access Specifier trong C#

Private Access Specifier trong C# cho phép một lớp ẩn các biến thành viên và các hàm thành viên của nó với các hàm và đối tượng khác. Chỉ có các hàm trong cùng lớp đó có thể truy cập tới các thành viên private. Ngay cả khi một Instance của một lớp cũng không thể truy cập các thành viên private của nó.

Ví dụ sau minh họa Private Access Specifier trong C#:

Lớp Rectangle

using System;

namespace VietJackCsharp
{
    class Rectangle
    {
        //cac bien thanh vien
        private double length;
        private double width;

        //cac phuong thuc
        public void Acceptdetails()
        {
            Console.WriteLine("Nhap chieu dai: ");
            length = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Nhap chieu rong: ");
            width = Convert.ToDouble(Console.ReadLine());
        }
        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Chieu dai: {0}", length);
            Console.WriteLine("Chieu rong: {0}", width);
            Console.WriteLine("Dien tich: {0}", GetArea());
        }
    }
}

Lớp ExecuteRectangle

using System;

namespace VietJackCsharp
{
    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Tinh dong goi trong C#");
            Console.WriteLine("-------------------------------");

            //tao doi tuong Rectangle
            Rectangle r = new Rectangle();
            //thiet lap cac thuoc tinh
            r.length = 4.5;
            r.width = 3.5;
            //goi phuong thuc
            r.Acceptdetails();
            r.Display();
            Console.ReadLine();

            Console.ReadKey();
        }
    }
}

Trong ví dụ, các biến thành viên length và width được khai báo private, vì thế chúng không thể được truy cập từ hàm Main(). Trong Visual Studio 2010 sẽ báo hiệu một dấu gạch đỏ bên dưới hai biến này, giống như:

Tính đóng gói trong C#

Các hàm thành viên AcceptDetails()Display() có thể truy cập các biến này. Khi các hàm thành viên AcceptDetails()Display() được khai báo public, chúng có thể được truy cập từ hàm Main() bởi sử dụng một Instance (một sự thể hiện) của lớp Rectangle, tên là r.

Protected Access Specifier trong C#

Protected Access Specifier trong C# cho phép một lớp con truy cập các biến thành viên và các hàm thành viên của lớp cơ sở của nó. Cách này giúp triển khai tính kế thừa. Chúng ta sẽ thảo luận chi tiết về tính kế thừa trong chương sau đó.

Internal Access Specifier trong C#

Internal Access Specifier trong C# cho phép một lớp trưng bày các biến thành viên và các hàm thành viên của nó tới các hàm và đối tượng khác trong Assembly hiện tại. Nói cách khác, bất kỳ thành viên nào với Internal Access Specifier trong C# có thể được truy cập từ bất kỳ lớp hoặc phương thức được định nghĩa bên trong ứng dụng mà thành viên đó được định nghĩa.

Ví dụ sau minh họa Internal Access Specifier trong C#:

Lớp Rectangle

using System;

namespace VietJackCsharp
{
    class Rectangle
    {
        //cac bien thanh vien
        internal double length;
        internal double width;

        //cac phuong thuc
        double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("Chieu dai: {0}", length);
            Console.WriteLine("Chieu rong: {0}", width);
            Console.WriteLine("Dien tich: {0}", GetArea());
        }
    }
}

Lớp ExecuteRectangle

using System;

namespace VietJackCsharp
{
    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Tinh dong goi trong C#");
            Console.WriteLine("-------------------------------");

            //tao doi tuong Rectangle
            Rectangle r = new Rectangle();
            //thiet lap cac thuoc tinh
            r.length = 4.5;
            r.width = 3.5;
            //goi phuong thuc
            r.Display();
            Console.ReadLine();

            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta 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ả sau:

Tính đóng gói trong C#

Trong ví dụ, bạn chú ý rằng hàm thành viên GetArea() không được khai báo với bất kỳ Access Specifier nào. Thì theo mặc định, Access Specifier của một thành viên lớp nếu chúng ta không khai báo là private.

Protected Internal Access Specifier trong C#

Protected Internal Access Specifier trong C# cho phép một lớp ẩn các biến thành viên và các hàm thành viên của nó với các hàm và đối tượng khác, ngoại trừ một lớp con bên trong cùng ứng dụng đó. Điều này cũng được sử dụng trong khi triển khai tính kế thừa trong C#.

Mọi người cho thể tham gia khóa học thứ 4 của vietjackteam vào cuối tháng 09/2017 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : Khóa học Java.Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Khóa học cũng đưa 200 câu hỏi phỏng vấn java trên https://www.javatpoint.com/corejava-interview-questions vào nội dung để giúp các bạn dễ dàng vượt qua kì phỏng vấn

Mọi người có thể xem demo nội dung khóa học tại địa chỉ Video demo khóa học Offline

Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Thông tin khóa học tại Khóa học Java Online trên Udemy

Loạt bài hướng dẫn học C# cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.