Я столкнулся с проблемой с интерфейсами. Я хочу связать метод, который выводит свой метод с цепочкой из абстрактного класса, который реализует интерфейс.
public interface IBaseInterface {
public IBaseInterface ChainableMethod()
}
public abstract AbstractClassThatHelps<T> where T: IBaseInterface n {
public T ChainableMethod() {
return (T) this;
}
}
public interface IDerived : IBaseInterface { }
public class DerivedClass : AbstractClassThatHelps<IDerived>, IDerived { }
IDerived derived = new DerivedClass();
derived.ChainableMethod().ChainableMethod();
Проблема, с которой я здесь сталкиваюсь: почему нельзя вернуть T
, когда показано, что он реализует контракт IModel?
Как бы я решил это по-другому? Я хотел бы иметь безопасность типов, но я вынужден для всех производных классов возвращать IBaseInterface вместо их собственного интерфейса.
Фактическая реализация:
У нас есть несколько моделей (DerivedClass
), которые реализуют соответствующие им IDerived
для внедрения зависимостей. Им нужны помощники, потому что я не хочу повторяться. Итак, мы используем AbstractClassThatHelps
в качестве базы, но, поскольку мы имеем дело с цепочечными методами, нам нужен этот базовый класс, чтобы знать, что возвращать, поэтому и дженерики. IBaseInterface
можно рассматривать как IModel
. Например, ChainableMethod
можно увидеть как GetAll()
.