Я покажу проблему на примере. Существует базовый класс с плавным интерфейсом:
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);
}
}
Проблема заключается в том, что при вызове customer.WithAccountNumber("000").WithFirstName("John").WithLastName("Smith")
вы не можете добавить .WithId(123)
в конце, потому что тип возврата метода WithLastName()
- это FluentPerson (не FluentCustomer).
Как обычно эта проблема решается?