我真的不明白为什么在此示例中,此类定义了两个 GetEnumerator 方法:一个明确实现接口,而另一个隐式< / strong>。那为什么呢?
def pip_install(package_name):
subprocess.call(
[sys.executable, '-m', 'pip', 'install', package_name]
)
答案 0 :(得分:7)
为什么[...]此类定义两个GetEnumerator方法:
好吧,一个是通用的,另一个不是通用的。
非通用版本是.NET v1中的遗物,比通用更早。
您有class FormattedAddresses : IEnumerable<string>
,但是IEnumerable<T>
源自旧界面IEnumerable
。
所以它实际上是class FormattedAddresses : IEnumerable<string>, IEnumerable
,您的类必须同时实现两者。两种方法的返回类型不同,因此不适用重载或覆盖。
请注意,旧版本是“明确”实施的,将其尽可能隐藏,并且不实施通常是可以接受的:
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplemented();
}
只有在功能强大的库类(而不是应用程序类)中,您才需要使其真正起作用。
答案 1 :(得分:2)
第二种方法实现该方法的非泛型版本。它是一个显式的接口实现,以避免名称冲突(重载不能仅因返回类型而异)。
无论如何都应删除整个班级。保留FormattedAddress
的列表,不要为其创建自定义列表类!