GT C Sharp cơ bản – Bài 8 : Chương 7: Khả năng truy xuất thành phần lớp
Chương 7:
Khả năng truy xuất thành phần lớp
Tác giả: Sưu tầm
Khái quát
Một trong những quyết định quan trọng để làm khi thiết kế một đối tượng là cách truy xuất đến các thành phần. Đối với C#, khả năng truy xuất có thể được điều khiển bằng một vài cách.
Khả năng truy xuất lớp
Cấp thô nhất mà ở đó khả năng truy xuất có thể được điều khiển là tại một lớp. Trong hầu hết các trường hợp, các bổ từ chỉ hợp lệ cho một lớp là public, có nghĩa là mọi người có thể thấy lớp đó, và internal. Ngoại lệ là các lớp lồng nhau bên trong các lớp khác, là hơi phức tạp hơn và được nói rõ trong Chương 8, “Vấn đề khác về lớp”.
Internal là một cách truy xuất được chấp nhận đến một tập các lớp rộng hơn mà không có truy xuất được chấp nhận đến mọi thứ, và nó thường được sử dụng nhất khi viết các lớp giúp đỡ mà nó nên được ẩn đối với người dùng cuối của lớp. Trong thời gian chạy .NET, internal xem như cho phép truy xuất đến tất cả các lớp trong cùng một hợp tập với lớp này.
Chú ý Đối với C++, khả năng truy xuất như vậy là thường được chấp nhận bằng cách sử dụng bạn bè, nó cung cấp truy xuất đến một lớp xác định. Bạn bè cung cấp tính chất như hột lớn hơn trong việc chỉ rõ ai có thể truy xuất một lớp, nhưng trong thực tế, truy xuất được cung cấp bằng internal là thường đủ khả năng.
Nói chung, tất cả các lớp nên là internal trừ khi người sử dụng nên được cho phép truy xuất chúng.
Sử dụng internal với các thành phần
Bổ từ internal cũng có thể được sử dụng với một thành phần, mà sau đó cho phép thành phần đó được truy xuất từ các lớp trong cùng hợp tập với nó, nhưng không từ các lớp bên ngoài hợp tập.
Điều này là đặc biệt hữu ích khi vài lớp công cần để hợp tác, nhưng vài thành phần chia sẽ không nên được phơi bày ra như công. Hãy xem xét ví dụ sau:
public class DrawingObjectGroup {
public DrawingObjectGroup() {
objects = new DrawingObject[10];
objectCount = 0;
}
public void AddObject(DrawingObject obj) {
if (objectCount < 10) {
objects[objectCount] = obj;
objectCount++;
}
}
public void Render() {
for (int i = 0; i < objectCount; i++) {
objects[i].Render();
}
}
DrawingObject[] objects;
int objectCount;
}
public class DrawingObject {
internal void Render() {}
}
class Test {
public static void
DrawingObjectGroup group = new DrawingObjectGroup();
group.AddObject(new DrawingObject());
}
}
Ở đây, đối tượng DrawingObjectGroup đưa ra mười đối tượng vẽ. Nó là hợp lệ đối với người sử dụng để có một tham chiếu đến DrawingObject, nhưng nó không hợp lệ đối với người sử dụng để gọi Render() cho đối tượng đó, nên điều này là được ngăn ngừa bằng cách tạo hàm Render() là nội tại.
Mẹo Mã này không có ý nghĩa như một chương trình thực tế. Thời gian chạy ngôn ngữ chung .NET có số lượng các lớp sưu tập làm cho công việc sắp xếp các thứ này không nhiều phức tạp và ít gặp lỗi hơn.
internal protected
Để cung cấp thêm một số tính linh hoạt trong cách một lớp được định nghĩa, bổ từ internal protected có thể được sử dụng để chỉ ra rằng một thành phần có thể được truy xuất từ hoặc một lớp có thể truy xuất nó thông qua đường dẫn truy xuất internal hoặc một lớp có thể truy xuất nó thông qua đường dẫn truy xuất protected. Nói cách khác, internal protected cho phép truy xuất internal hoặc protected.
Sự tương tác giữa khả năng truy xuất lớp và thành phần
Các bổ từ truy xuất lớp và thành phần phải được thoả mãn cho một thành phần để được truy xuất. Khả năng truy xuất của các thành phần được giới hạn bởi lớp để nó không vượt quá khả năng truy xuất của lớp đó.
Hãy xem xét tình huống sau:
internal class MyHelperClass {
public void PublicFunction() {}
internal void InternalFunction() {}
protected void ProtectedFunction() {}
}
Nếu lớp này được định nghĩa như lớp công, thì khả năng truy xuất của các thành phần là tương tự như khả năng truy xuất được định nghĩa; có nghĩa là, PublicFunction() là công, InternalFunction() là nội tại, và ProtectedFunction() là được bảo vệ.
Tuy nhiên, bởi vì lớp là nội tại nên public trong PublicFunction() được giảm thành internal.