- ¿Cómo podemos implementar el patrón del constructor de Joshua's Effective Java en C#?
A continuación se muestra el código que he intentado, ¿hay una mejor manera de hacerlo?¿Cómo implementar y extender el patrón de constructor de Joshua en .net?
public class NutritionFacts
{
public static NutritionFacts.Builder Build(string name, int servingSize, int servingsPerContainer)
{
return new NutritionFacts.Builder(name, servingSize, servingsPerContainer);
}
public sealed class Builder
{
public Builder(String name, int servingSize,
int servingsPerContainer)
{
}
public Builder totalFat(int val) { }
public Builder saturatedFat(int val) { }
public Builder transFat(int val) { }
public Builder cholesterol(int val) { }
//... 15 more setters
public NutritionFacts build()
{
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) { }
protected NutritionFacts() { }
}
¿Cómo podemos extender dicha clase? ¿Es necesario escribir clases de constructor separado para cada una de las clases derivadas?
public class MoreNutritionFacts : NutritionFacts { public new static MoreNutritionFacts.Builder Build(string name, int servingSize, int servingsPerContainer) { return new MoreNutritionFacts.Builder(name, servingSize, servingsPerContainer); } public new sealed class Builder { public Builder(String name, int servingSize, int servingsPerContainer) {} public Builder totalFat(int val) { } public Builder saturatedFat(int val) { } public Builder transFat(int val) { } public Builder cholesterol(int val) { } //... 15 more setters public Builder newProperty(int val) { } public MoreNutritionFacts build() { return new MoreNutritionFacts(this); } } private MoreNutritionFacts(MoreNutritionFacts.Builder builder) { } }
>> "que encaja bien con los inicializadores de objetos de C# 3." En este caso se creará como nuevo SomeMessage.Build (Name =" GK ", Age = 0). Pero es tan bueno como escribir nuevo SomeMessage (Name =" GK ", Age = 0) ¿correcto? En este caso, Necesitamos el método de compilación? ¿Cómo nos ayudará a evitar constructores telescópicos? –
No, se escribirá como nuevo SomeMessage.Builder {Name = "GK", Age = 0}. Tenga en cuenta la diferencia entre corchetes y llaves. La diferencia es que solo necesita especificar las propiedades que desea. Tenga en cuenta que con C# 4, un único constructor con muchos parámetros opcionales proporcionará otra opción. –
Ok. Ahora lo tengo. Nuevo SomeMessage {Name = "GK", Age = 0 } no es posible, las propiedades son privadas, solo el constructor puede acceder. –