Самым полезным приложением, которое я нашел, является реализация фабрик. Во многих случаях полезно создавать классы, которые являются изменяемыми внутри фабрики, но неизменяемыми для внешних классов. Это может быть легко реализовано в 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;
}
}
Вот для чего я бы использовал явные интерфейсы.