接口与抽象类(在特定情况下)

Mar*_*aro 6 .net c#

我在这个网站上做了一些搜索,以避免重复,但大多数问题都是关于接口和抽象类之间的抽象比较.

我的问题更多的是我的具体情况,特别是我的同事,我不同意同样的方法.

我有3节课

  1. 节点(文件夹结构中的抽象节点)
  2. 文件夹(包含子文件夹和文件)
  3. 文件

我们使用复合模式来获取每个用户/组的所有文件夹及其权限

该类Node,应该是接口还是Abstract类? FolderFile继承自Node.

在我看来,我认为Node应该是一个摘要,因为File不应该有所有的方法,Folder例如AddFolder(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
    }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*iec 6

这里没有正确的答案.这真的归结为这个问题

"是否Node有任何的实现是共同的FileFolder?"

如果答案是肯定的,则需要一个Abstract类,可选择使用描述其行为的Interface

如果答案为,那么您可以将其设置为接口,可选择使用抽象基础实现.

所以你看 - 它的方式基本相同.


此外,还有什么能够阻止Folder加入上没有定义额外的方法Node,其File将不会共享.

例如,

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!
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 5

拒绝接口的理由似乎不对.为什么File会有一个方法,AddFolder如果Node是一个抽象类,但如果它是一个接口?

如果您具有所有子项共享的通用功能,通常会选择创建抽象类.在这种情况下,这个通用功能将由抽象基类实现,因此不必在所有子类中实现.

在许多情况下,您甚至同时拥有:

  1. 描述合同的界面
  2. 一个实现接口和一些常用功能的抽象类