为什么不能像这样使用泛型?直接为每个具体类型声明公共开放类型或接口和单独的逻辑:
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] 删除。
我来说两句