C# offre un metodo estremamente comodo per scrivere piΓΉ costruttori di una stessa classe che si richiamano lβun lβaltro.
Questa tecnica Γ¨ detta constructor chaining.
Eβ possibile inoltre concatenare costruttori della classe padre tramite il comando base
.
Segue un esempio:
class Foo {
private int id;
private string name;
// Costruttore effetivo
public Foo(int id, string name) {
this.id = id;
this.name = name;
}
// estensione senza parametri in ingresso
public Foo() : this(0, "") { }
// estensione passando solo l'id
public Foo(int id) : this(id, "") { }
// estensione passando solo il name
public Foo(string name) : this(0, name) { }
// Chiamata del costruttore della superclasse
public Foo(string name) : base(name) { }
}
Eβ importante sottolineare che, qualora non venga utilizzato lβattributo this
, il compilatore considererΓ lβestensione con il costrutore della superclasse, analogamente ad aver scritto base
.
Lβordine con cui questi costruttori viene eseguito segue la logica, in quanto viene chiamato prima il costruttore concatenato, e poi il costruttore effetivamente chiamato dallβesterno.
Per capirne bene il funzionamento indico questo esempio, preso da questo post.
public Dog(string name, int age, string favToy) {
Console.WriteLine("name/age/favToy constructor executing");
}
public Dog(string name, int age) : this(name, age, "ball") {
Console.WriteLine("name/age constructor executing");
}
public Dog(string name) : this(name, 1) {
Console.WriteLine("name constructor executing");
}
Dog dog = new Dog("dog name");
// name/age/favToy constructor
// name/age constructor
// name constructor