接口隔离原理-如何调用在单独的接口中定义的方法?

时间:2019-01-11 23:09:51

标签: c# .net interface polymorphism

因此,我们拥有一个已经存在很长时间的界面。我们称之为IFoo。它定义了很多方法,并且实现了大约10个类。

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

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

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

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

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

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

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

到目前为止,一切都很好。但是我不确定如何访问这些方法。因为当我们使用相同的工厂方法时:

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

foo没有IBar中的任何方法。

工厂方法如下所示(这是缩小比例的版本,可以使本文更容易实现):

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

因此,无论如何,我仍不清楚如何修改所有这些内容以访问IBar中的方法。

2 个答案:

答案 0 :(得分:1)

直接暴力手段是

struct User*

答案 1 :(得分:1)

如果您只是尝试使用type conversion,则您的代码将无法抵抗更改,并且可能会在refactoring期间中断。为了选择解决方案,您需要回答以下问题:

  • 什么是IFooIBar?为什么要分离此接口,何时应使用它们?这是关于使用interface-segregation principle的动机的问题。如果您有2个完全不同的用例,则可以,但是不要仅仅为了遵守规则而使用它。具有许多方法的接口是可以的。如果您确定IFooIBar实际上是一个接口,则只需将它们组合为IFooBar接口。
  • 好的。我们决定确实有两个接口。下一个问题是为什么类Somethings实现了这两个接口?它会破坏Single responsibility principle吗?如果是这样,则需要将此类分为class Foo : IFooclass Bar : IBar并为类Bar创建一个新工厂,以便在需要调用BarMethod()的情况下使用它。您可能有重复的代码问题或重用共享资源的问题。
  • 如果您有重复的代码问题,只需使用inheritance即可解决。
    public class SomeBase { /* common code */ }
    public class Foo : SomeBase, IFoo { /* IFoo impementation */ }
    public class Bar : SomeBase, IBar { /* IBar impementation */ }
  • 如果您有重用共享资源的问题,可以使用dependency injection解决。例如,您将添加BarFactory,并且FooFactoryBarFactory都使用SharedResourceRepository来存储并允许访问共享资源。如果使用IoC-Container,则可以通过其配置解决问题。
  • 好的。我们决定我们确实有一个班级。下一个问题是为什么您需要检索IFoo的实例才能使用其IBar方法?它肯定会破坏面向对象的设计,并且每个解决方案都只是一个hack。您应该创建BarFactory并使用Singletone,IoC容器等解决单实例问题。