내가 찾은 가장 유용한 응용 프로그램은 공장 구현입니다. 대부분의 경우 팩토리 내부에서 변경 가능하지만 외부 클래스로는 변경할 수없는 클래스를 작성하는 것이 유용합니다. 필드와 세터를 비공개로 만들고 게터를 공개 멤버로 노출함으로써 내부 클래스를 사용하여 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;
}
}
그것이 내가 명시 적 인터페이스를 사용하는 것입니다.