例によって問題を示します。流暢なインターフェースを持つ基本クラスがあります:
class FluentPerson
{
private string _FirstName = String.Empty;
private string _LastName = String.Empty;
public FluentPerson WithFirstName(string firstName)
{
_FirstName = firstName;
return this;
}
public FluentPerson WithLastName(string lastName)
{
_LastName = lastName;
return this;
}
public override string ToString()
{
return String.Format("First name: {0} last name: {1}", _FirstName, _LastName);
}
}
および子クラス:
class FluentCustomer : FluentPerson
{
private long _Id;
private string _AccountNumber = String.Empty;
public FluentCustomer WithAccountNumber(string accountNumber)
{
_AccountNumber = accountNumber;
return this;
}
public FluentCustomer WithId(long id)
{
_Id = id;
return this;
}
public override string ToString()
{
return base.ToString() + String.Format(" account number: {0} id: {1}", _AccountNumber, _Id);
}
}
問題は、メソッドの戻り値の型が FluentPerson (FluentCustomer ではない)であるため、呼び出すときに最後にcustomer.WithAccountNumber("000").WithFirstName("John").WithLastName("Smith")
追加できないことです。.WithId(123)
WithLastName()
この問題は通常どのように解決されますか?