界面和抽象C#继承

时间:2018-09-11 10:51:06

标签: c# .net interface .net-core abstract

我遇到接口问题。我希望链接一个方法,该方法从实现接口的抽象类派生其可链接方法。

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()

3 个答案:

答案 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();
    }
}