我无法使用Generics和Polymorphism进行测试。
以下是我尝试编译时遇到的错误:
类型'Testing.ChildBar'不能在泛型类型或方法'Testing.BaseFoo'中用作类型参数'T'。没有从“Testing.ChildBar”到“Testing.IBar”的隐式引用转换。
类型'Testing.ChildBar'不能在泛型类型或方法'Testing.BaseFoo'中用作类型参数'T'。没有从“Testing.ChildBar”到“Testing.IFoo”的隐式引用转换。
以下是我收到上述错误的控制台应用程序的代码:
class Program
{
static void Main(string[] args)
{
Console.ReadKey();
}
}
public interface IFoo
{
Task<bool> Method1();
Task<bool> Method2();
Task<bool> Method3();
Task<bool> Method4();
Task<bool> Method5();
}
public interface IBar<T> where T : BaseBar
{
T MyStuff { get; set; }
}
public abstract class BaseFoo<T> where T : BaseBar, IFoo, IBar<T>
{
public abstract T MyStuff { get; set; }
public abstract Task<bool> Method1();
public abstract Task<bool> Method2();
public abstract Task<bool> Method3();
public abstract Task<bool> Method4();
public abstract Task<bool> Method5();
}
public abstract class BaseBar
{
}
public class ChildBar : BaseBar
{
public string TestMethod { get { return "Testing123"; } }
}
public class ChildFoo : BaseFoo<ChildBar>
{
private ChildBar _myStuff;
public override ChildBar MyStuff
{
get
{
if (_myStuff == null)
{
_myStuff = new ChildBar();
}
return _myStuff;
}
set
{
_myStuff = value;
}
}
public override Task<bool> Method1() { return new Task<bool>(); }
public override Task<bool> Method2() { return new Task<bool>(); }
public override Task<bool> Method3() { return new Task<bool>(); }
public override Task<bool> Method4() { return new Task<bool>(); }
public override Task<bool> Method5() { return new Task<bool>(); }
private void Test()
{
var test = MyStuff.TestMethod;
}
}
我希望能够做的是创建许多不同的ChildFoo,每个都有一个“MyStuff”属性,但“MyStuff”属性可以是我创建的任何继承自BaseBar的类。
如果你能想到更好的方法来做到这一点。我听见了。
答案 0 :(得分:3)
我希望能够做的是创建许多不同的ChildFoo,每个都有一个“MyStuff”属性,但“MyStuff”属性可以是我创建的任何继承自BaseBar的类。
我认为这转化为:
public abstract class BaseFoo<T> : IBar<T>, IFoo
where T : BaseBar
由于IBar<T>
定义了MyStuff
属性,如果您希望BaseFoo
的孩子拥有该属性,那么您应该说BaseFoo
扩展IBar<T>
。您的原始代码说它的泛型参数(ChildBar
)应该具有该属性。