抱歉这个奇怪的标题。我真的不知道如何更好地表达它......
我在以下代码段中收到错误消息。我到处都使用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()
{
}
}
答案 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()
{
}
}