gpt4 book ai didi

c# - Collection 不包含 ICollection 接口(interface)的所有属性

转载 作者:太空狗 更新时间:2023-10-30 00:18:25 26 4
gpt4 key购买 nike

Collection<T>类实现多个接口(interface),其中之一是 ICollection . ICollection接口(interface)有 2 个未在 Collection<T> 中实现的属性.

在 C# 中,我相信您必须在继承接口(interface)的类中实现接口(interface)的所有方法和属性。那么Collection<T>怎么样呢?类允许逃脱吗?

最佳答案

这叫做 explicitly implementing an interface .除非对象引用转换为接口(interface)类型,否则您可以使成员对外部不可见。

Collection<T> 的上下文中实现 ICollection ,所讨论的接口(interface)定义了在将泛型引入 C# 之前就存在的遗留方法。您可以说这是管理集合的“旧丑陋”方式。

实现者决定隐藏这些丑陋的方法,同时仍然向调用者提供其功能。

var x = new Collection<int>();
object syncRoot = x.SyncRoot; //CS1061: Collection<int> does not contain a ....
ICollection collection = x;
syncRoot = collection.SyncRoot; //ok

另一种情况是存在冲突,通常是由于外部接口(interface)设计不佳,无法更改。一个例子:

interface IFile
{
void Save();
}
interface IDatabaseRecord
{
void Save();
}

class Customer : IFile, IDatabaseRecord
{
public void Save()
{
//what to do here?
}
}

这可以通过显式实现该方法来克服:

class Customer : IFile, IDatabaseRecord
{
void IFile.Save() { }
void IDatabaseRecord.Save() { }
}

请注意,这几乎总是一种代码味道 - 它可能会使调用者误以为方法不存在,或者调用了错误的实现(这导致首先发布了这个问题)。

关于c# - Collection<T> 不包含 ICollection 接口(interface)的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37150720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com