C#泛型类型中的多态性

菲菲拉克特

为什么不能像这样使用泛型?直接为每个具体类型声明公共开放类型或接口和单独的逻辑:

interface IOpen<T>
{
    T A { get; }
}

class Concrete<int> : IOpen<int>
{
    public int A => 42;
    public string B => "42";
}

interface IWorker<T>
{
    void Do(IOpen<T> item);
}

class WorkerInt : IWorker<int>
{
    public void Do(Concrete<int> item)
    {
        Console.WriteLine(item.A);
        Console.WriteLine(item.B);
    }
}

如何避免上面代码中的限制?如果我创建类,ConcreteInt : IOpen<int>WorkerInt不会实现IWorker<T>. 谢谢。

神秘性

您不能定义class Concrete<int>with <int>- 这就像您试图int用一个名为int. 但是在课堂上,你试图实际返回一个int.

所以它应该看起来像:

class Concrete : IOpen<int>
{
    public int A => 42;
    public string B => "42";
}

但是现在这个类WorkerInt必须是这样的:

class WorkerInt : IWorker<int>
{
    public void Do(Concrete item)
    {
        Console.WriteLine(item.A);
        Console.WriteLine(item.B);
    }
}

但是IWorker<int>必须实现void Do(IOpen<T> item),即使Concrete实现IOpen<T>你也不能使用,void Do(Concrete item)因为它比void Do(IOpen<T> item).

所以你必须这样定义它:

class WorkerInt : IWorker<int>
{
    public void Do(IOpen<int> item)
    {
        Console.WriteLine(item.A);
        //Console.WriteLine(item.B);
    }
}

但这使得item.B不再工作,因为IOpen<int>没有B财产。

使这项工作的唯一方法是更改IWorker为:

interface IWorker<T, R> where T : IOpen<R>
{
    void Do(T item);
}

然后WorkerInt可以是这样的:

class WorkerInt : IWorker<Concrete, int>
{
    public void Do(Concrete item)
    {
        Console.WriteLine(item.A);
        Console.WriteLine(item.B);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章