我遇到接口问题。我希望链接一个方法,该方法从实现接口的抽象类派生其可链接方法。
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()
。
答案 0 :(得分:2)
为了使以下代码正常工作,AbstractClassThatHelps<T>
必须实现IBaseInterface
。如果this
不是this
IBaseInterface
public abstract AbstractClassThatHelps<T> where T: IBaseInterface n{
public T ChainableMethod(){
return this;
}
}
编辑:我不是用户该设计要解决的问题,但这是我对您要实现的目标的尝试→
public interface IBaseInterface
{
IBaseInterface ChainableMethod();
}
public abstract class AbstractClassThatHelps<T>:IBaseInterface where T : IBaseInterface{
public T ChainableMethod()
{
IBaseInterface i = this;
return (T)i.ChainableMethod();
}
IBaseInterface IBaseInterface.ChainableMethod()
{
return this;
}
}
public class Concrete : AbstractClassThatHelps<Concrete>
{
}
答案 1 :(得分:1)
您可以返回T
的实例,但是返回类型不能为T
,而必须为IBaseInterface
,因为是界面所需的。
答案 2 :(得分:0)
这有效,您的代码充满语法错误:
public interface IBaseInterface
{
IBaseInterface ChainableMethod();
}
public abstract class AbstractClassThatHelps : IBaseInterface
{
public IBaseInterface ChainableMethod()
{
return this;
}
}
public interface IDerived : IBaseInterface
{
}
public class DerivedClass : AbstractClassThatHelps, IDerived
{
}
internal static class Program
{
public static void Main()
{
IDerived derived = new DerivedClass();
derived.ChainableMethod().ChainableMethod();
}
}
您也可以尝试以下方法:
public interface IBaseInterface
{
IBaseInterface ChainableMethod();
}
public abstract class AbstractClassThatHelps<T> : IBaseInterface where T : class, IBaseInterface
{
public T ChainableMethod()
{
return this as T;
}
IBaseInterface IBaseInterface.ChainableMethod()
{
return ChainableMethod();
}
}
public interface IDerived : IBaseInterface
{
IDerived Hello();
}
public class DerivedClass : AbstractClassThatHelps<IDerived>, IDerived
{
public IDerived Hello()
{
Console.WriteLine("Hello");
return this;
}
}
internal static class Program
{
public static void Main()
{
AbstractClassThatHelps<IDerived> derived = new DerivedClass();
derived.ChainableMethod().Hello().ChainableMethod();
}
}