不能使用具有泛型约束的相同类型从通用基类和特定接口继承

时间:2010-06-15 09:43:04

标签: generics inheritance c#-3.0 interface

抱歉这个奇怪的标题。我真的不知道如何更好地表达它......

我在以下代码段中收到错误消息。我到处都使用Dummy类。编译器是否理解我在DummyImplBase上添加的约束?如果我直接使用Dummy而不是将其设置为约束,这是一个编译器错误吗?

错误1'ConsoleApplication53.DummyImplBase'未实现接口成员'ConsoleApplication53.IRequired.RequiredMethod()'。 'ConsoleApplication53.RequiredBase.RequiredMethod()'无法实现'ConsoleApplication53.IRequired.RequiredMethod()',因为它没有匹配的返回类型'ConsoleApplication53.Dummy'。 C:\ Documents and Settings \ simen \ My Documents \ Visual Studio 2008 \ Projects \ ConsoleApplication53 \ ConsoleApplication53 \ Program.cs 37 27 ConsoleApplication53

public class Dummy
{
}

public interface IRequired<T>
{
    T RequiredMethod();
}

public interface IDummyRequired : IRequired<Dummy>
{
    void OtherMethod();
}

public class RequiredBase<T> : IRequired<T>
{
    public T RequiredMethod()
    {
        return default(T);
    }
}

public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired
    where T: Dummy
{
    public void OtherMethod()
    {
    }
}

3 个答案:

答案 0 :(得分:1)

您可以将其添加到DummyImplBase:

   public Dummy RequiredMethod() { return base.RequiredMethod(); }

编辑:或者,如果您使用的是C#4.0,您可以像这样更改IRequired的定义:

public interface IRequired<out T>

然后删除IDummyRequired,你仍然可以分配派生类 IRequired<Dummy>(但不是IDummyRequired)。

第二次编辑:您的原始代码未编译,因为T可能是Dummy或从Dummy派生的类。并实施了方法

public DummyDerived RequiredMethod() 

的签名不同
public Dummy RequiredMethod()

在IDummyDerived中声明。

答案 1 :(得分:0)

我将DummyImplBase更改为:

public abstract class DummyImplBase<T> : RequiredBase<Dummy>, IDummyRequired
        where T : Dummy
{
    public void OtherMethod()
    {
    }
}

答案 2 :(得分:0)

如果我将IDummyRequired设为通用它也有效,所以我想我必须改变我的一些设计才能实现这一点。我仍然希望找出为什么我的解决方案不起作用。

public class Dummy
{
}

public interface IRequired<T>
{
    T RequiredMethod();
}

public interface IDummyRequired<T> : IRequired<T>
    where T : Dummy
{
    void OtherMethod();
}

public class RequiredBase<T> : IRequired<T>
{
    public T RequiredMethod()
    {
        return default(T);
    }
}

public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired<T>
    where T: Dummy
{
    public void OtherMethod()
    {
    }
}