采用以下代码(非常类似于我正在尝试做的事情)。
IDirectory.cs
public interface IDirectory { string FullPath{ get; } }
DirectoryTree.cs
public class DirectoryTree { private Directory _root; ... public IDirectory GetRoot(){...}; private class Directory: IDirectory { ... } }
我想为使用此库的其他类提供一种方法来访问Directory的信息,但是以“不可变”的方式,所以只在接口中使用“get”函数。在内部,例如,在重命名目录(FileSystemWatcher)的情况下,我可以使用setter更新目录名称字段,但只能从DirectoryTree或Directory类内部更新。可以在DirectoryTree中注册事件以通知更改。
界面似乎对此最有意义,但我缺乏经验。我总是在印象之下接口只是让它很容易与不同类的类似部分进行交互,但我没有看到任何人使用它们来“保护”类的一部分与外界隔离的例子。这也让我想知道我是否打破了封装?接口是解决此问题的可取方法吗?
答案 0 :(得分:1)
我认为这种方式对你有好处。但在我推荐阅读这些文章之前:
接口更适合您的应用程序需要许多可能不相关的对象类型来提供某些功能的情况。
接口比基类更灵活,因为您可以定义一个可以实现多个接口的实现。
在不必从基类继承实现的情况下,接口更好。
当您不能使用类继承时,接口很有用。例如,结构不能从类继承,但它们可以实现接口。
答案 1 :(得分:0)
我不认为Interface是这个特定任务的合适选择。
我宁愿创建一个抽象基类并在我的公共类中继承它。 这样,只能通过连接到其他类的公共类来更改基类的信息。
由于接口不允许您实现代码,因此您实际上将在实现接口的类中包含所有代码,并且您可以选择隐藏该实现,但我更愿意使用抽象基类来实现此目的。