Ứng dụng hữu ích nhất mà tôi tìm thấy là với các nhà máy triển khai. Trong nhiều trường hợp, rất hữu ích khi tạo các lớp có thể thay đổi bên trong nhà máy nhưng không thay đổi đối với các lớp bên ngoài. Điều này có thể được thực hiện dễ dàng trong Java bằng cách sử dụng các lớp bên trong, bằng cách đặt các trường và setters của chúng ở chế độ riêng tư và chỉ hiển thị các getters là thành viên công cộng. Tuy nhiên, trong C #, tôi đã phải sử dụng các giao diện rõ ràng để đạt được điều tương tự. Tôi sẽ giải thích thêm:
Trong Java, lớp bên trong VÀ lớp bên ngoài có thể truy cập các thành viên riêng của nhau, điều này có nghĩa hoàn toàn vì các lớp có liên quan rất chặt chẽ với nhau. Chúng nằm trong cùng một tệp mã và có thể được phát triển bởi cùng một nhà phát triển. Điều này có nghĩa là các trường và phương thức riêng trong lớp bên trong vẫn có thể được nhà máy truy cập để sửa đổi giá trị của chúng. Nhưng các lớp bên ngoài sẽ không thể truy cập vào các trường này ngoại trừ thông qua các công cụ thu thập công khai của họ.
Tuy nhiên, trong C #, các lớp bên ngoài không thể truy cập các thành viên riêng của các lớp bên trong để khái niệm đó không được áp dụng trực tiếp. Tôi đã sử dụng một giao diện rõ ràng như một cách giải quyết bằng cách định nghĩa một giao diện riêng trong lớp bên ngoài và thực hiện rõ ràng nó trong lớp bên trong. Theo cách này, chỉ có lớp bên ngoài có thể truy cập các phương thức trong giao diện này giống như cách nó được thực hiện trong Java (nhưng chúng phải là các phương thức chứ không phải các trường).
Thí dụ:
public class Factory
{
// factory method to create a hard-coded Mazda Tribute car.
public static Car CreateCar()
{
Car car = new Car();
// the Factory class can modify the model because it has access to
// the private ICarSetters interface
((ICarSetters)car).model = "Mazda Tribute";
return car;
}
// define a private interface containing the setters.
private interface ICarSetters
{
// define the setter in the private interface
string model { set; }
}
// This is the inner class. It has a member "model" that should not be modified
// but clients, but should be modified by the factory.
public class Car: ICarSetters
{
// explicitly implement the setter
string ICarSetters.model { set; }
// create a public getter
public string model { get; }
}
}
class Client
{
public Client()
{
Factory.Car car = Factory.CreateCar();
// can only read model because only the getter is public
// and ICarSetters is private to Factory
string model = car.model;
}
}
Đó là những gì tôi sẽ sử dụng giao diện rõ ràng cho.