实现一个接口方法,获取接口或基础 class 的 IEnumerable 作为参数
Implement an interface method that gets IEnumerable of interface or of base class as parameter
[类似的问题之前肯定被问过很多次了,但不知为何找不到合适的副本,所以打开这个]
一般:
是否有可能实现一个接口方法,它获取接口或 base-class 的 IEnumerable
作为类型参数,其中实现方法 IEnumerable
使用类型-class 的参数,它从基础 class?
实现 interface\derives
更具体地说:
- 我们有:
- 一些接口类型
interface IZ
和一些实现 classes:
class CZ1: IZ
class CZ2: IZ
- 一些基础 class 类型
class CZ
和一些派生的 class 类型:
class CZ1: CZ
class CZ2: CZ
interface IA
定义了一个方法,其参数为:
IEnumerable<IZ>
,或:
IEnumerable<CZ>
.
class CA1 : IA
希望用IEnumerable<CZ1>
实现接口的方法,而class CA2 :IA
希望用IEnumerable<CZ2>
实现接口的方法。
这样的实现会引发错误:
<class> does not implement interface member <method with IEnumerable of interface\base-class>
- 使这种实现编译的可能方法是什么?
- 使用带约束的通用类型参数有什么帮助吗?
- 如果没有内置的方式让它以直接的方式工作,是否有一个好的“设计模式”来使实现在这种“精神”中发挥作用?
完整示例:
用作 IEnumerable
类型参数的类型(此处使用 IZ
,但 CZ
的行为方式应相同):
interface IZ {}
class CZ1 : IZ {}
class CZ2 : IZ {}
尝试使用类型参数的类型:
interface IA
{
void Set(IEnumerable<IZ> records)
}
class CA1 : IA
{
public void Set(IEnumerable<CZ1> records) {} <-- compile error
}
class CA2 : IA
{
public void Set(IEnumerable<CZ2> records) {} <-- compile error
}
像这样?
interface IZ { }
class CZ1 : IZ { }
class CZ2 : IZ { }
interface IA<T> where T : IZ
{
void Set(IEnumerable<T> records);
}
class CA1 : IA<CZ1>
{
public void Set(IEnumerable<CZ1> records) { }
}
class CA2 : IA<CZ2>
{
public void Set(IEnumerable<CZ2> records) { }
}
[类似的问题之前肯定被问过很多次了,但不知为何找不到合适的副本,所以打开这个]
一般:
是否有可能实现一个接口方法,它获取接口或 base-class 的 IEnumerable
作为类型参数,其中实现方法 IEnumerable
使用类型-class 的参数,它从基础 class?
更具体地说:
- 我们有:
- 一些接口类型
interface IZ
和一些实现 classes:class CZ1: IZ
class CZ2: IZ
- 一些基础 class 类型
class CZ
和一些派生的 class 类型:class CZ1: CZ
class CZ2: CZ
- 一些接口类型
interface IA
定义了一个方法,其参数为:IEnumerable<IZ>
,或:IEnumerable<CZ>
.
class CA1 : IA
希望用IEnumerable<CZ1>
实现接口的方法,而class CA2 :IA
希望用IEnumerable<CZ2>
实现接口的方法。
这样的实现会引发错误:
<class> does not implement interface member <method with IEnumerable of interface\base-class>
- 使这种实现编译的可能方法是什么?
- 使用带约束的通用类型参数有什么帮助吗?
- 如果没有内置的方式让它以直接的方式工作,是否有一个好的“设计模式”来使实现在这种“精神”中发挥作用?
完整示例:
用作 IEnumerable
类型参数的类型(此处使用 IZ
,但 CZ
的行为方式应相同):
interface IZ {}
class CZ1 : IZ {}
class CZ2 : IZ {}
尝试使用类型参数的类型:
interface IA
{
void Set(IEnumerable<IZ> records)
}
class CA1 : IA
{
public void Set(IEnumerable<CZ1> records) {} <-- compile error
}
class CA2 : IA
{
public void Set(IEnumerable<CZ2> records) {} <-- compile error
}
像这样?
interface IZ { }
class CZ1 : IZ { }
class CZ2 : IZ { }
interface IA<T> where T : IZ
{
void Set(IEnumerable<T> records);
}
class CA1 : IA<CZ1>
{
public void Set(IEnumerable<CZ1> records) { }
}
class CA2 : IA<CZ2>
{
public void Set(IEnumerable<CZ2> records) { }
}