全部,我有一个应用程序需要定期附加和分离多个SQL数据库。我想创建一个类,将所有这些数据库保存为可以迭代的集合。要做到这一点,我继承自ICollection
,但有一些想法我不理解:
class SqlDataBases : ICollection<SqlDb>
{
private List<SqlDb> dbColl;
public SqlDataBases()
{
dbColl = new List<SqlDb>();
}
// Add an index to the collection.
public SqlDb this[int _nIndex]
{
get { return (SqlDb)dbColl[_nIndex]; }
set { dbColl[_nIndex] = value; }
}
// et al.
}
public class DbEnumerator : IEnumerator<SqlDb>
{
// ...
}
class SqlDb
{
private string strMdfFullPath;
private string strLdfFullPath;
private bool bIsAttached;
public SqlDb(string _strMdfFullPath, string _strLdfFullPath, bool _bIsAttached)
{
this.strMdfFullPath = _strMdfFullPath;
this.strLdfFullPath = _strLdfFullPath;
this.bIsAttached = _bIsAttached;
}
}
我的问题是“为什么要继承ICollection
,当你必须自己添加'添加','包含'等方法?或者你必须按照{{{ 3}}?我一直在阅读“C#in a Nutshell”,这个问题在这本伟大的书中引人注目。
我道歉,我知道我在这里遗漏了一些东西......
答案 0 :(得分:3)
我的问题是“当你必须自己添加诸如'添加','包含'等方法时,为什么要继承ICollection?
ICollection<T>
是接口 - 它只是指定您必须实现的成员。如果您想从已经具有实现的内容派生,请查看Collection<T>
。如果您想创建具有自己特殊特征的自己的集合数据结构,您可以自己实现该界面 - 我怀疑您是否想要这样做。
说实话,目前还不清楚为什么你想要自己的课程 - 为什么不直接在客户端代码中使用List<SqlDb>
?
答案 1 :(得分:3)
您是否考虑过直接使用List<SqlDb>
?
我希望通过SqlDataBases类获得什么并不明显。
如果您无法直接使用List<SqlDb>
,请考虑继承List<SqlDb>
而不是ICollection<SqlDb>
。
答案 2 :(得分:2)
接口只是骷髅。它们不包含任何逻辑,它们只包含所有方法,属性等的签名。
答案 3 :(得分:2)
继承ICollection&lt;&gt;的原因是创建自己的自定义集合类型。然后,如果某个方法的输入变量为ICollection&lt;&gt;,因为您从ICollection&lt;&gt;继承,则可以传入新的自定义集合类型。
在您的情况下,您只需使用List&lt;&gt;直到您发现需要创建自定义集合。
答案 4 :(得分:1)
回答“当你必须添加诸如'添加'之类的方法时,为什么要继承ICollection”:
如果您不需要/想要添加/下一个等,则不需要继承ICollection。