c# - 接口(interface)继承是一种不好的做法吗?

标签 c# oop design-patterns inheritance

我想知道下面的代码是否显示了一个不好的做法(关于接口(interface)继承):

public interface IFoo : IDisposable
{
    void Test();
}

public class TestImpl : IFoo
{
    public void Test()
    {
        // do something
    }

    public void Dispose()
    {
        // disposing my dependencies
    }
}

public class FooFactory
{
    public IFoo CreateFoo()
    {
        return new TestImpl();
    }
}

public class Client
{
    public void Main()
    {
        FooFactory factory = new FooFactory();
        using(IFoo foo = factory.CreateFoo())
        {
            // do stuff then auto-dispose
            foo.Test();
        }
    }
}

在这里,我想要两件事: 1. 使用 C# 的 using 语句,这样我就可以优雅地处理具体对象的依赖项(无需将任何内容强制转换为 IDisposable)。 2. 使用工厂方法创建具体对象,这样我就可以只使用接口(interface)。

分开,两者都是众所周知的好做法,但放在一起呢?我在这里没有发现任何说错的东西http://msdn.microsoft.com/en-us/library/ms229022.aspx (MSDN - 界面设计),但我觉得这听起来不太好......

如果对此有任何评论,我将不胜感激。如果这是一种不好的做法,我使用这种方法会遇到什么样的问题?

谢谢!

最佳答案

在野外,没有绝对好的或坏的做法,每种做法都有其优点和缺点。
一种实践只有在应用于具体问题时才会变得好或坏(阅读:不是IFoo)。

public bool IsGood<TContext>(IPractice practice)
    where TContext : RealWorldApplication, new();

因此,与其尝试在 MSDN 上寻找指导,不如问自己以下问题:

Does this solve the problem and make the code simpler to read?

如果答案是,那就去吧。

就我个人而言,我喜欢这种方法。如果 IFoo 的合约需要 适当的处置(想想:IGraphicalObjectIResourceIConnection),明确这一点是一个非常好的设计决策。

不要被教条所困:使用接口(interface)编程可以减少对具体实现的依赖,但是使用接口(interface)编程可能是一场噩梦。讲道理,就是这样。

更新

您可以使用 Google 查找所有继承自 .NET Framework 本身中的 IDisposable 的接口(interface):

intitle:interface "inherits idisposable" site:msdn.microsoft.com

正如我上面所说,这通常是针对已知消耗资源的实体完成的,例如数据库连接、非托管对象包装器、图形对象等。

在一个没有可处理的的类上强加实现Dispose()将不是一个好主意。
在这种情况下,最好将其保留为可选并检查是否支持 IDisposable,如 suggested by Peter .

关于c# - 接口(interface)继承是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6997648/

相关文章:

c# - 单元测试异步方法 C#

c# - XDocument XPath + Regex 元素定位器

javascript - 使用 jQuery 编写 OO Javascript

java - 如何使用回调来实现 session 模式?

java - 寻找正确的模式。数据封装。 java

c# - 带有卡在 GetContext() 上的 SSL 证书的 HttpListener

使用 System.Security.Cryptography.Aes 的 AES256 加密的 C# 示例

php - 试图用 Mysqli 插入我得到 "Using $this when not in object context in"

.net - 构造函数变量是否应该直接传递给私有(private)字段或属性?

javascript - OO JavaScript,我该如何改进这个类?有没有更好、更干净的方法?