Я использую странно повторяющийся шаблон (CRTP) в моем проекте на C #, но у меня возникли некоторые проблемы. Код взломан по ссылке выше:
public abstract class Base<T> where T : Base<T>{
public T FluentMethod() {
return (T)(this);
}
}
public class Derived : Base<Derived> {
}
Красивая! Проблема возникает, когда я пытаюсь сделать что-то вроде этого:
public class SomeClass
{
Base<T> GetItem() { /* Definition */ };
}
SomeClass должен иметь возможность возвращать любую реализацию класса Base, но, разумеется, T не имеет здесь никакого значения, так как это происходит в другом классе. Помещение Derived вместо T компилируется, но это не то, что я хочу, так как я должен иметь возможность возвращать элементы других типов, если они получены из Base. Кроме того, GetItem () может возвращать различные типизированные объекты в зависимости от состояния объекта SomeClass, поэтому создание универсального SomeClass также не является решением.
Я что-то упускаю здесь очевидное или это нельзя сделать при использовании CRTP?