我遇到了接口问题。我希望链接一个方法,该方法从实现接口的抽象类派生其可链接方法。
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()
。
这很有效,你的代码充满了语法错误:
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();
}
}
为了使下面的代码能够工作,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>
{
}
您可以返回T
的实例,但返回类型不能是T
但必须是IBaseInterface
,因为这是接口所需的。