Я создаю свободный интерфейс, в котором у меня есть базовый класс, содержащий большую часть плавной логики, и производный класс, который добавляет некоторое специализированное поведение. Проблема, с которой я сталкиваюсь, — это тип возвращаемого значения быстрых методов в базовом классе при вызове из экземпляра производного типа. После вызова метода базового класса только методы базового класса остаются доступными для дальнейших быстрых вызовов.
Изменение порядка, в котором вызываются методы, поможет ему скомпилироваться, но сделает его менее читаемым, что в некотором роде важно для быстрых интерфейсов. Есть ли способ определить какой-то тип This для базового класса, чтобы все методы возвращали один и тот же тип.
Пример
public class Field<T>
{
public Field<T> Name( string name )
{
_name = name;
return this;
}
}
public SpecialField<T> : Field<T>
{
public SpecialField<T> Special(){ return this; }
}
// !!! Arrgh. Special is not a member of the Field<T> class.
var specialField = new SpecialField()
.Name( "bing" )
.Special();
Сломанное решение
Я пытался решить это, выполнив что-то вроде следующего, но это недопустимо для С# :( но, по крайней мере, выражает то, как я хотел бы закодировать интерфейс.
public class Field<T,TThis> : TThis
where TThis : Field<T,TThis>
{
public TThis Name( string name ){...}
}
public SpecialField<T> : Field<T,SpecialField<T>>
{
public TThis Special(){ return this; }
}