私が見つけた最も有用なアプリケーションは、工場の実装です。多くの場合、ファクトリ内で変更可能であるが、外部クラスに対して不変であるクラスを作成すると便利です。これは、フィールドとそのセッターをプライベートにして、ゲッターをパブリックメンバーとして公開するだけで、内部クラスを使用して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;
}
}
それは私が明示的なインターフェイスを使用するものです。