Aplikasi paling berguna yang saya temukan adalah dengan menerapkan pabrik. Dalam banyak kasus, berguna untuk membuat kelas yang bisa berubah di dalam pabrik tetapi tidak dapat diubah ke kelas eksternal. Ini dapat dengan mudah diimplementasikan di Jawa menggunakan kelas dalam, dengan membuat bidang dan setternya pribadi dan hanya mengekspos getter sebagai anggota publik. Namun dalam C #, saya harus menggunakan antarmuka eksplisit untuk mencapai hal yang sama. Saya akan jelaskan lebih lanjut:
Di Jawa, kelas dalam DAN kelas luar dapat mengakses anggota pribadi satu sama lain, yang masuk akal karena kelas-kelas tersebut sangat terkait erat. Mereka berada dalam file kode yang sama dan mungkin dikembangkan oleh pengembang yang sama. Ini berarti bahwa bidang dan metode pribadi di kelas dalam masih dapat diakses oleh pabrik untuk mengubah nilai-nilai mereka. Tetapi kelas eksternal tidak akan dapat mengakses bidang ini kecuali melalui pengambil publik mereka.
Namun, dalam C #, kelas luar tidak dapat mengakses anggota pribadi kelas dalam sehingga konsep itu tidak langsung berlaku. Saya menggunakan antarmuka eksplisit sebagai solusi dengan mendefinisikan antarmuka pribadi di kelas luar dan secara eksplisit mengimplementasikannya di kelas dalam. Dengan cara ini, hanya kelas luar yang dapat mengakses metode di antarmuka ini dengan cara yang sama dilakukan di Jawa (tetapi mereka harus metode, bukan bidang).
Contoh:
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;
}
}
Itulah yang akan saya gunakan untuk antarmuka eksplisit.