制作抽象类或使用处理器?

时间:2010-06-09 00:08:50

标签: c# interface abstract-class

我正在开发一个类来比较两个目录,并在目录目录中不存在源目录中的目录/文件时运行一个动作。

以下是该类的原型:

public abstract class IdenticalDirectories
{

    private DirectoryInfo _sourceDirectory;
    private DirectoryInfo _destinationDirectory;

    protected abstract void DirectoryExists(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);
    protected abstract void DirectoryDoesNotExist(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);
    protected abstract void FileExists(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);
    protected abstract void FileDoesNotExist(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);

    public IdenticalDirectories(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory)
    {
        ...
    }

    public void Run()
    {

        foreach (DirectoryInfo sourceSubDirectory in _sourceDirectory.GetDirectories()) 
        {
            DirectoryInfo destinationSubDirectory = this.GetDestinationDirectoryInfo(subDirectory);

            if (destinationSubDirectory.Exists()) {
                this.DirectoryExists(sourceSubDirectory, destinationSubDirectory);
            } else {
                this.DirectoryDoesNotExist(sourceSubDirectory, destinationSubDirectory);
            }

            foreach (FileInfo sourceFile in sourceSubDirectory.GetFiles()) {
                FileInfo destinationFile = this.GetDestinationFileInfo(sourceFile);

                if (destinationFile.Exists()) {
                    this.FileExists(sourceFile, destinationFile);
                } else {
                    this.FileDoesNotExist(sourceFile, destinationFile);
                }
            }
        }
    }
}

上面的原型是一个抽象类。我想知道让类非抽象并让Run方法接收器成为处理器会更好吗?例如

public void Run(IIdenticalDirectoriesProcessor processor)
{

    foreach (DirectoryInfo sourceSubDirectory in _sourceDirectory.GetDirectories()) {
        DirectoryInfo destinationSubDirectory = this.GetDestinationDirectoryInfo(subDirectory);

        if (destinationSubDirectory.Exists()) {
            processor.DirectoryExists(sourceSubDirectory, destinationSubDirectory);
        } else {
            processor.DirectoryDoesNotExist(sourceSubDirectory, destinationSubDirectory);
        }


        foreach (FileInfo sourceFile in sourceSubDirectory.GetFiles()) {
            FileInfo destinationFile = this.GetDestinationFileInfo(sourceFile);

            if (destinationFile.Exists()) {
                processor.FileExists(sourceFile, destinationFile);
            } else {
                processor.FileDoesNotExist(sourceFile, destinationFile);
            }

        }

    }

}

您认为每种实施的利弊是什么?

2 个答案:

答案 0 :(得分:2)

传入IIdenticalDirectoriesProcessor可以为您提供动态的运行时灵活性,并且可以使IdenticalDirectories类更容易测试,并且不会将IIdenticalDirectoriesProcessor的实现耦合到IdenticalDirectories类,就像您最初提出的抽象/派生类解决方案一样。

当我只有1或2个抽象方法来覆盖这些天时,我经常只接受Func或Action委托,而不是创建一个接口。这为您提供了最高程度的分离。然而,任何超过1或2,它变得笨重,所以你想选择一个更传统的实现。

请注意我的意见。

答案 1 :(得分:2)

在.NET中,委托是实现回调的首选方式。在不支持委托的其他语言中(即大多数Java版本),接口很常见,有时会提供一个提供接口默认实现的类。

在仅支持单一继承的语言中,使用抽象类有一个明显的缺点:它耗尽了消费者的一个继承槽。这不是接口的问题。