2012-03-01 94 views
2

所有的,我有一个应用程序需要定期连接和分离多个SQL数据库。我想创建一个类,将所有这些数据库保存为可迭代的集合。要做到这一点,我从ICollection继承,但有一些thinkg我不理解:.NET 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继承可言,当你必须添加方法,如‘添加’,“包含'etc.你自己吗?或者你必须自己按照MSDN中的建议自己去做?我一直在阅读“C#in a Nutshell”,这个问题在这本书中很突出。我知道我在这里失去了一些东西...

+0

我的想法是一样的;为什么不在需要的地方使用'List '?它具有您尝试实现的功能,只要我能看到。 – 2012-03-01 12:10:51

+1

@Killercam,下面的一条评论建议使用Dictionary <>。除非你想通过名称反复“查找”你的连接,否则Dictionary <>会更好,因为你可以指定一个类似于数据库名称的键。 – 2012-03-01 12:33:25

+0

感谢您的帮助。 – MoonKnight 2012-03-01 13:36:44

回答

3

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

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

说实话,目前还不清楚为什么你想要自己的班级 - 为什么不直接在客户端代码中使用List<SqlDb>

+0

感谢乔恩,这已经整理出我的愚蠢。你说得对,我只需要在这里列出一个列表,但我之前并没有创建自己的收藏课,并且幻想这样做,但这是愚蠢的。谢谢你的时间。 – MoonKnight 2012-03-01 12:17:53

2

接口只是骨架。他们不包含,它们只包含所有方法,属性等

Interfaces

3

你有没有想过直接使用List<SqlDb>的签名任何逻辑?

这对我来说不是很明显,你希望通过SqlDataBases类获得什么。

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

+1

虽然...我会把它放到字典中,但是其原因尚不清楚 – b0rg 2012-03-01 12:20:57

1

回答“为什么自ICollection继承可言,当你必须添加方法,如‘添加’”:

你不需要继承ICollection的,如果你并不需要/想有添加/ Next等

2

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

在你的情况,你可以简单地使用列表<>直到你找到需要创建一个自定义集合。