接口分离原则-如何调用在单独接口中定义的方法



所以我们有一个已经存在很长时间的接口。我们称之为IFoo。它定义了很多方法,大约有10个类实现它

一直以来,当我们需要创建其中一个类的实例时,我们使用了一个简单的工厂模式:

IFoo foo = FooFactory.Create(...);

然后,当然,我们可以访问IFoo中定义的所有方法:

foo.Method1();
foo.Method2();
etc.

但现在,我们有一些方法需要在十个类中的一些中,但不是全部。因此,根据接口分离原则,我认为我们应该创建一个新的接口:IBar

因此,需要在IBar中定义的方法的类将如下所示:

public class something: IFoo, IBar
{
...
}

到目前为止还不错。但我不确定如何访问这些方法。因为当我们使用相同的工厂方法时:

IFoo foo = FooFactory.Create(...);

CCD_ 3不具有CCD_ 4中的任何方法。

工厂方法看起来是这样的(这是一个缩小的版本,让这篇文章更容易):

public static IFoo Create(string className)
{
Type type = Type.GetType(className);
return (IFoo)Activator.CreateInstance(type);
}

所以,无论如何,我不清楚如何修改所有这些,以便也可以访问IBar中的方法。

如果您只是尝试使用类型转换,您的代码将无法抵抗更改,并且可能在重构过程中中断。为了选择解决方案,您需要回答以下问题:

  • 什么是IFooIBar?为什么要将这些接口分开,什么时候应该使用它们?这是关于使用界面分离原理的动机的问题。如果你有两个真正不同的用例,那没关系,但你不应该仅仅为了遵守规则而使用它。有许多方法的接口是可以的。如果您确定IFooIBar实际上是一个接口,那么只需将它们组合为IFooBar接口即可
  • 好的。我们决定我们真的有两个接口。下一个问题是Something类为什么同时实现这两个接口?这是否违反了单一责任原则?如果是这样,则需要将这个类分离为class Foo : IFooclass Bar : IBar,并为类Bar创建新的工厂,以便在需要调用BarMethod()的情况下使用它。您可能存在重复代码问题或重复使用共享资源问题
  • 如果您有重复的代码问题,那么只需使用继承来解决它
public class SomeBase { /* common code */ }
public class Foo : SomeBase, IFoo { /* IFoo impementation */ }
public class Bar : SomeBase, IBar { /* IBar impementation */ }
  • 如果您有重用共享资源的问题,那么可以通过依赖注入来解决。例如,您将添加BarFactory,而FooFactoryBarFactory都使用存储并允许访问共享资源的SharedResourceRepository。如果您使用IoC Container,那么问题就可以通过其配置来解决
  • 好的。我们决定只上一节课。下一个问题是,为什么需要检索IFoo的实例才能使用其IBar方法?它肯定打破了面向对象的设计,每个解决方案都只是一个破解。您应该创建BarFactory,并使用Singletone、IoC容器等解决单实例问题

相关内容

最新更新