使用具有多态性的通用接口

时间:2014-10-02 22:31:42

标签: c# generics polymorphism

我无法使用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的类。

如果你能想到更好的方法来做到这一点。我听见了。

1 个答案:

答案 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)应该具有该属性。