Bulduğum en kullanışlı uygulama fabrikaları uygulamak. Birçok durumda, fabrika içinde değiştirilebilen ancak harici sınıflarla değiştirilemeyen sınıflar oluşturmak yararlıdır. Bu, Java'yı iç sınıfları kullanarak, alanları ve ayarlayıcılarını özel yaparak ve yalnızca alıcıları herkese açık üye olarak göstererek kolayca uygulanabilir. Ancak C #, aynı şeyi elde etmek için açık arabirimler kullanmak zorunda kaldı. Daha fazla açıklayacağım:
Java'da, iç sınıf VE dış sınıf, birbirlerinin özel üyelerine erişebilir, bu da sınıflar çok yakından ilişkili olduğu için tam mantıklıdır. Aynı kod dosyasındadır ve muhtemelen aynı geliştirici tarafından geliştirilmiştir. Bu, iç sınıftaki özel alanlara ve yöntemlere fabrika tarafından değerlerini değiştirmek için erişilebileceği anlamına gelir. Ancak harici sınıflar, kamu alanlarından gelenler dışında bu alanlara erişemeyecektir.
Ancak, C # 'da, dış sınıflar iç sınıfların özel üyelerine erişemez, böylece kavram doğrudan uygulanabilir değildir. Dış sınıfta özel bir arabirim tanımlayıp iç sınıfta açıkça uygulayarak açık bir arabirimi geçici çözüm olarak kullandım. Bu şekilde, yalnızca dış sınıf bu arabirimdeki yöntemlere Java'da olduğu gibi erişebilir (ancak alanlar değil, yöntemler olmalıdır).
Misal:
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;
}
}
Bunun için açık arayüzler kullanırdım.