2

总之,我有一个应用程序需要定期附加和分离多个 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,当您必须自己添加诸如 'Add'、'Contains' 等方法时?或者您是否必须按照MSDN中的建议自己执行此操作?我一直在阅读“C# in a果壳”,而这个问题在这本伟大的书中没有得到解决。

我道歉,我知道我在这里遗漏了一些东西......

4

5 回答 5

3

我的问题是“为什么要从 ICollection 继承,当您必须自己添加诸如 'Add'、'Contains' 等方法时?

ICollection<T>是一个接口- 它只是指定您必须实现的成员。如果您想从已经有实现的东西中派生请查看Collection<T>. 如果您想创建自己的具有自己特殊特征的集合数据结构,您将自己实现接口 - 我怀疑您是否想这样做。

老实说,您根本不清楚为什么要在这里拥有自己的类——为什么不List<SqlDb>直接在客户端代码中使用呢?

于 2012-03-01T12:10:28.933 回答
3

有没有想过List<SqlDb>直接使用?

对我来说,您希望通过 SqlDataBases 类获得什么并不明显。

如果不能List<SqlDb>直接使用,考虑继承 fromList<SqlDb>而不是ICollection<SqlDb>.

于 2012-03-01T12:14:59.797 回答
2

接口只是骨架。它们不包含任何逻辑,它们仅包含所有方法、属性等的签名。

接口

于 2012-03-01T12:11:44.353 回答
2

从 ICollection<> 继承的原因是创建自己的自定义集合类型。然后,任何方法的输入变量为 ICollection<>,因为您继承自 ICollection<>,所以可以传入新的自定义集合类型。

在您的情况下,您可以简单地使用 List<> 直到您发现需要创建自定义集合。

于 2012-03-01T12:22:56.820 回答
1

回答“为什么要从 ICollection 继承,当您必须添加诸如 'Add' 之类的方法时”:

如果您不需要/不想拥有 Add/Next 等,则不需要继承 ICollection。

于 2012-03-01T12:22:26.507 回答