6

重複を避けるためにこの Web サイトでいくつかの検索を行いましたが、ほとんどの質問はインターフェイスと抽象クラスの抽象比較に関するものでした。

私の質問は、私の特定の状況、特に私の同僚に関するものであり、同じアプローチについては同意しません。

私は3つのクラスを持っています

  1. ノード (フォルダー構造の抽象ノード)
  2. フォルダー (サブフォルダーとファイルを含む)
  3. ファイル

複合パターンを使用して、ユーザー/グループごとにすべてのフォルダーとそのアクセス許可を取得します

クラスNodeは、インターフェイスまたは抽象クラスである必要がありますか? FolderノードからFile継承します。

私の意見では、たとえばあるすべてのメソッドを持つべきではないNodeため、抽象化する必要があると思いますFileFolderAddFolder(Node node)

私の同僚は、より良いコーディングのためにインターフェイスを使用する方が良いと言いました。

編集:ノードを次のように書き直しました:

public abstract class Node 
{
    public string Name { get; set; }
    public string FullName { get; set; }
    public Node Parent { get; set; }

    public List<PermissionEntry> Permissions { get; set; }

    protected Node(string fullName)
    {
        FullName = fullName;
        Permissions = new List<PermissionEntry>();
    }

    public void AssignPermission()
    {
       // some Codes
    }
}
4

5 に答える 5

6

ここに正解はありません。それは本当にこの質問に要約されます

「と に共通する実装はNodeありますFileFolder?」

答えがyesの場合、Abstract クラスが必要です。オプションで、その動作を説明する Interface を使用できます

答えがno の場合は、オプションで抽象基本実装を使用して、インターフェイスにすることができます。

ご覧のとおり、基本的にはどちらでも同じです。


その上、共有しない定義されていFolderない追加のメソッドを追加することを止めるものは何もありません。NodeFile

例えば、

public interface INode
{
   void SomethingCommon();
}

public File: INode
{
    public void SomethingCommon(){...}  // I must implement this   
}

public Folder : INode
{
    public void SomethingCommon(){...}  // I must implement this   
    public void AddFolder(string name)
    {
        // File doesnt need this method, its not on the interface!
    }
}
于 2013-02-07T08:49:33.467 に答える
5

インターフェイスを拒否する理由は間違っているようです。抽象クラスの場合はメソッドを持ち、インターフェイスの場合はFileメソッドを持たないのはなぜですか?AddFolderNode

すべての子が共有する共通の機能がある場合は、通常、抽象クラスを作成することを選択します。この場合、この共通機能は抽象基本クラスによって実装されるため、すべての子に実装する必要はありません。

多くの場合、次の両方があります。

  1. コントラクトを記述するインターフェース
  2. インターフェイスといくつかの共通機能を実装する抽象クラス
于 2013-02-07T08:49:13.390 に答える
1

おっしゃることから……。

Node がインターフェースであろうとクラスであろうと、メソッド「AddFolder」があり、File がそれを実装できない場合、設計に問題があります。

問題は、ノードが十分に抽象化されていないことです。共通のインターフェースに絞り込む必要があります。

于 2013-02-07T08:49:42.513 に答える
1

私は通常、次のルールを使用します。

2 つのクラスに共通のメソッドがいくつかあるが、それらの実装が異なる場合は、インターフェイスを使用します。

2 つのクラスに共通のメソッドがあり、共通の実装を共有している場合は、抽象クラスを基本クラスとして使用します。

于 2013-02-07T08:58:57.313 に答える
1

Node が抽象化されるべき理由についてのあなたの議論は、 File が Folder と同じメソッドを持つべきではないためです。ノードをインターフェースにすることが、同じメソッドを持つことを意味するのはなぜですか? INode は、File と Folder の両方が実装するマーカー インターフェイスである可能性があります。フォルダーに個別の一連の操作がある場合 (それは慎重に行われます)、それらの操作が定義された IFolder 用の別のインターフェイスがあります。

短い質問から、私は個人的にこのシナリオでインターフェイスを使用します。継承を使用することで、ファイルに属さないファイルが継承するノードで何かを定義するのは非常に簡単だからです。

于 2013-02-07T08:53:18.463 に答える