题
所有,我有一个应用程序需要定期附加和分离多个SQL数据库。我想创建一个类,将所有这些数据库保存为可以迭代的集合。要做到这一点,我继承自 ICollection
, ,但有一些thinkg我不明白:
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
在所有,当你必须添加方法,如'Add','Contains'等。你自己?或者你必须按照建议自己这样做吗 MSDN?我一直在阅读"C#简而言之",这个问题在这本伟大的书中没有得到解决。
我道歉,我知道我在这里错过了一些东西。..
解决方案
我的问题是"为什么要从ICollection继承,当你必须添加方法,如'Add','Contains'等。你自己?
ICollection<T>
是一个 界面 -它只是指定你必须实现的成员。如果你想从已经有的东西中派生出来 有 一个实现,看 Collection<T>
.如果你想创建自己的具有自己特殊特征的集合数据结构,你会自己实现接口-我怀疑你想要这样做。
说实话,现在还不清楚为什么你想要自己的班级在这里-为什么不直接使用 List<SqlDb>
直接在客户端代码中?
其他提示
你有没有想过使用 List<SqlDb>
直接?
对我来说,你希望通过SqlDataBases类获得什么并不明显。
如果你不能使用 List<SqlDb>
直接,想想继承自 List<SqlDb>
而不是 ICollection<SqlDb>
.
接口只是骨架。它们不包含任何逻辑,它们只包含所有方法,属性等的签名。
继承自ICollection的原因<>是创建自己的自定义集合类型。然后,任何方法具有ICollection的输入变量的地方<>,因为你继承自ICollection<>,您的新自定义集合类型可以传入。
在你的情况下,你可以简单地使用List<>直到您发现需要创建自定义集合。
回答"当你必须添加诸如'Add'之类的方法时,为什么要从ICollection继承":
如果您不需要/想要添加/下一步等,则不需要继承ICollection。