【问题标题】:Best Practice for implementing an interface multiple times多次实现接口的最佳实践
【发布时间】:2016-07-17 21:13:16
【问题描述】:
public interface IDoSomething

public class ClassA : IDoSomething
public class ClassB : IDoSomething
public class ClassC : IDoSomething

我有一个由多个类实现的接口,还有一段代码需要解析一些数据,然后创建这些对象的新实例。现在我有一个很大的 switch 语句来确定使用哪个对象,但必须有更好的方法。

我希望能够创建还实现接口的新类,对类进行编码,并且永远不必重构代码(例如在 switch 语句中添加 case)。

实现这样的最佳实践是什么?

这是我当前(糟糕的)switch 语句的样子:

switch (flag)
{
    case 1:
        return new ClassA();
    case 2:
        return new ClassB();
    case 3:
        return new ClassC();
    default:
        return null;
}

【问题讨论】:

  • 您可以使用字典.. dict = new Dictionary<int, Func<IDoSomething>> { { 1, () => new ClassA() } } 然后您的方法变为(加上错误检查/不匹配键检查):return dict[flag]();

标签: c# interface coding-style extends conventions


【解决方案1】:

这是何时使用abstract factory 的一个很好的例子。我在this page 上举了一个例子。如果您向下滚动到第二个代码块,您会看到它正在处理相同的场景 - 我需要返回一个接口的实现,并且我想使用一些值来告诉我要返回哪个实现。

您可以在不使用 DI 容器的情况下执行此操作,但它们对此很有用,因为当他们创建 IDoSomething 的实现时,如果该实现也有依赖关系,它也会创建它们。因此,如果ClassA 需要将某些内容传递给其构造函数,并且需要将某个值传递给其构造函数,则 DI 容器会处理所有这些。

我喜欢 Windsor,因为它提供了抽象工厂的nice implementation

这个答案的问题在于,我建议您深入研究依赖注入来解决这个特定问题。但我真的很推荐它。您正在尝试对接口进行编程,它促进了这种类型的设计。它需要你正在做的事情,并让它变得如此简单,以至于你会做的越来越多。

我需要写一篇博文,从头开始更多地描述它。

【讨论】:

  • 我经常开始四处寻找能够很好地解释此类事情的博客文章,而不会在其中加入大量不必要的行话。然后当我找不到它时,我自己写。 (不知道会不会好点。)这是个什么样的项目? (WCF、网站等)或者如果它只是一个类库,它会从什么样的应用程序中调用?我可以从头开始写一些更好地解释它的东西,而不是我抛出一个想法而不完全解释/展示它。
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多