abstract class ClassePaiBuilder<T> where T : ClassePaiBuilder<T> {
public T SetAtributo(string atributo) {
// codigo
return (T)(object)this;
}
public object Build() => new object();
}
class ClasseFilhaBuilder : ClassePaiBuilder<ClasseFilhaBuilder> {
public ClasseFilhaBuilder SetOutroAtributo(string outroAtributo) {
// codigo
return this;
}
}
public class Program {
public void Main() =>
new ClasseFilhaBuilder()
.SetAtributo("atributo da classe pai")
.SetOutroAtributo("atributo da classe filha")
.Build();
}
//https://pt.stackoverflow.com/q/92654/101
YWJzdHJhY3QgY2xhc3MgQ2xhc3NlUGFpQnVpbGRlcjxUPiB3aGVyZSBUIDogQ2xhc3NlUGFpQnVpbGRlcjxUPiB7CiAgICBwdWJsaWMgVCBTZXRBdHJpYnV0byhzdHJpbmcgYXRyaWJ1dG8pIHsKICAgICAgICAvLyBjb2RpZ28KICAgICAgICByZXR1cm4gKFQpKG9iamVjdCl0aGlzOwogICAgfQoKICAgIHB1YmxpYyBvYmplY3QgQnVpbGQoKSA9PiBuZXcgb2JqZWN0KCk7Cn0KCmNsYXNzIENsYXNzZUZpbGhhQnVpbGRlciA6IENsYXNzZVBhaUJ1aWxkZXI8Q2xhc3NlRmlsaGFCdWlsZGVyPiB7CiAgICBwdWJsaWMgQ2xhc3NlRmlsaGFCdWlsZGVyIFNldE91dHJvQXRyaWJ1dG8oc3RyaW5nIG91dHJvQXRyaWJ1dG8pIHsKICAgICAgICAvLyBjb2RpZ28KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KfQoKcHVibGljIGNsYXNzIFByb2dyYW0gewogICAgcHVibGljIHZvaWQgTWFpbigpID0+CiAgICAgICAgbmV3IENsYXNzZUZpbGhhQnVpbGRlcigpCiAgICAgICAgICAgIC5TZXRBdHJpYnV0bygiYXRyaWJ1dG8gZGEgY2xhc3NlIHBhaSIpCiAgICAgICAgICAgIC5TZXRPdXRyb0F0cmlidXRvKCJhdHJpYnV0byBkYSBjbGFzc2UgZmlsaGEiKQogICAgICAgICAgICAuQnVpbGQoKTsKfQoKLy9odHRwczovL3B0LnN0YWNrb3ZlcmZsb3cuY29tL3EvOTI2NTQvMTAx