2011-08-26 85 views
2

我已阅读接口VS内部变量VS继承字典

When should I choose inheritance over an interface when designing C# class libraries?

我相信,我的理解是,一个VS必做的关系。说完这一切是我的困境。

我想要实现键值对最有可能的对象的集合。我需要添加到添加和删除事件只做验证,检查重复和一些跟踪的东西。

如果我实现了IDictionary,它似乎实现了所有Idictionary <>,ICollection <>,IEnumerable <>和IEnumerable。是的,他们大多数是一个内衬。

不建议从词典继承,因为它从来没有打算延长,阴影的添加和删除。

最后我只能实现一个私有变量,然后暴露我想的方法或需要的项目

的方向有什么建议去?

回答

2

您应该使用成分和封装类里面的字典(私有变量选项)。这样,您只能向外界公开对您的对象有意义的操作,并且您使用字典的事实仅仅是实现细节。

您应该只执行IDictionary<,>Dictionary<,>继承如果你的类是通用字典一些特殊characterists。

0

最简单的办法是实施的IDictionary作为一个实例变量,敷添加和删除的添加方法和删除你的类,添加或删除对象或从字典之前执行的验证方法。

0

继承是当你需要继承的实现。否则,如果你想继承接口,位未实现,则使用接口。

0

我建议也许设计一些自己的字典上下的接口,其中包括你感兴趣的功能。除此之外,我建议有一些接口,其存在完全读取接口,并且其中一些允许读 - 写入访问。除此之外,如果你有一个只读接口,那么不关心一个特定字典是可变的还是不可变的方法将能够使用IReadableDict(由可变和不可变字典实现),而需要或者字典是可变的,或者它是不可变的将能够指定。此外,分离出一些其他接口将允许最大可能的协方差和相反性。例如,期待IReadableDict < String,Animal >的代码可能完全满意于字典< String,Cat >,即使代码期望IReadWriteDict字符串,动物>将不能接受字典<字符串, Cat >。同样,只需要知道字典计数的代码就可以接受一个暴露了Count方法的非泛型ICountable,而只需要知道某个键是否存在的代码可以接受非泛型IQueryExistence(请注意,完全合法地检查Dict < Cat,PurrVolume >是否包含Dog的特定实例;答案将是“否”,但问题是有效的)。