次のコードを見てください (私がやろうとしていることとよく似ています)。
IDirectory.cs
パブリック インターフェイス IDirectory
{
文字列 FullPath{ get; }
}
DirectoryTree.cs
パブリック クラス DirectoryTree
{
プライベート ディレクトリ _root;
...
public IDirectory GetRoot(){...};
プライベート クラス ディレクトリ: IDirectory
{
...
}
}
このライブラリを使用する他のクラスがディレクトリの情報にアクセスする方法を提供したいのですが、「不変」の方法で、インターフェイスで「get」関数のみを使用します。内部的には、たとえばディレクトリの名前が変更された場合 (FileSystemWatcher)、setter を使用してディレクトリ名フィールドを更新できますが、DirectoryTree または Directory クラス内からのみです。イベントを DirectoryTree に登録して、変更を通知することができます。
これにはインターフェースが最も理にかなっているように見えますが、私は経験がありません。私は常に、インターフェイスは異なるクラスの類似部分とのやり取りを簡単にするだけだという印象を受けてきましたが、クラスの一部を外界から「保護」するためにインターフェイスを使用している例を見たことがありません。これは、カプセル化を破っているのかどうかも疑問に思いますか? インターフェイスはこの問題を解決するための賢明な方法ですか?