【问题标题】:Using Generic Interfaces with Polymorphism使用具有多态性的通用接口
【发布时间】:2014-10-02 22:31:42
【问题描述】:

我无法让我的测试使用泛型和多态性。

这是我尝试编译时遇到的错误:

类型“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 的类。

如果您能想出更好的方法来做到这一点。我全神贯注。

【问题讨论】:

  • 那个类结构真的令人困惑。您能否提供一个更具体的示例来说明您要完成的工作?

标签: c# generics polymorphism


【解决方案1】:

我想做的是创建许多不同的 ChildFoo,每个都有一个“MyStuff”属性,但“MyStuff”属性可以是我创建的任何继承自 BaseBar 的类。

我认为这可以转化为:

public abstract class BaseFoo<T> : IBar<T>, IFoo
    where T : BaseBar

由于IBar&lt;T&gt; 定义了MyStuff 属性,如果您希望BaseFoo 的子级拥有该属性,您应该说BaseFoo 扩展IBar&lt;T&gt;。您的原始代码说它的通用参数 (ChildBar) 应该具有该属性。

【讨论】:

  • 非常感谢!这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2019-10-12
  • 2017-11-28
  • 1970-01-01
  • 2022-11-07
相关资源
最近更新 更多