我发现最有用的应用程序是实施工厂。在许多情况下,创建在工厂内部可变但对外部类不可变的类很有用。可以通过使用内部类在Java中轻松实现此目的,方法是将字段及其设置器设为私有,并且仅将获取器公开为公共成员。但是,在C#中,我必须使用显式接口来实现相同的目的。我将进一步说明:
在Java中,内部类和外部类可以访问彼此的私有成员,这是很有意义的,因为这些类之间的关系非常紧密。它们在同一代码文件中,可能由同一开发人员开发。这意味着内部类中的私有字段和方法仍可以由工厂访问以修改其值。但是,外部类只能通过其公共获取程序来访问这些字段。
但是,在C#中,外部类无法访问内部类的私有成员,因此该概念不能直接应用。通过在外部类中定义一个私有接口并在内部类中显式实现它,我将显式接口用作解决方法。这样,只有外部类可以像在Java中一样访问此接口中的方法(但它们必须是方法,而不是字段)。
例:
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;
}
}
那就是我要使用显式接口的目的。