Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口分离原则-如何调用在单独接口中定义的方法?_C#_.net_Interface_Polymorphism - Fatal编程技术网

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

C# 接口分离原则-如何调用在单独接口中定义的方法?,c#,.net,interface,polymorphism,C#,.net,Interface,Polymorphism,所以我们有一个界面已经存在很长时间了。让我们称之为IFoo。它定义了很多方法,大约有10个类实现了它 一直以来,当我们需要创建其中一个类的实例时,我们使用了一个简单的工厂模式: IFoo foo = FooFactory.Create(...); 当然,我们可以访问IFoo中定义的所有方法: foo.Method1(); foo.Method2(); etc. 但是现在,我们有一些方法需要在这十个类中的一些类中,但不是全部。因此,根据接口隔离原则,我的理解是我们应该创建一个新的接口:IBar

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

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

IFoo foo = FooFactory.Create(...);
当然,我们可以访问IFoo中定义的所有方法:

foo.Method1();
foo.Method2();
etc.
但是现在,我们有一些方法需要在这十个类中的一些类中,但不是全部。因此,根据接口隔离原则,我的理解是我们应该创建一个新的接口:
IBar

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

public class something: IFoo, IBar
{
     ...
}
到目前为止还不错。但我不确定的是如何访问这些方法。因为当我们使用相同的工厂方法时:

IFoo foo = FooFactory.Create(...);
foo
没有
IBar
中的任何方法

factory方法如下所示(这是一个缩小的版本,以使此帖子更简单):

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

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

  • 什么是
    IFoo
    IBar
    ?为什么要将这些接口分开,什么时候应该使用它们?这是关于使用动机的问题。如果你有两个完全不同的用例,这是可以的,但是你不应该仅仅为了遵守规则而使用它。有许多方法的接口是可以的。如果您确定
    IFoo
    IBar
    实际上是一个接口,那么只需将它们组合到
    IFooBar
    接口即可
  • 嗯。我们决定我们真的有两个接口。下一个问题是为什么类某物实现了这两个接口?它断了吗?如果是这样,那么您需要将该类划分为
    class Foo:IFoo
    class Bar:IBar
    ,并为class
    Bar
    创建新的工厂,以便在需要调用
    BarMethod()
    的情况下使用它。您可能有重复代码问题或重用共享资源问题
  • 如果你有重复代码的问题,那么就用它来解决
  • 如果您有重用共享资源的问题,那么可以使用解决方案。例如,您将添加
    BarFactory
    ,并且
    FooFactory
    BarFactory
    都使用
    SharedResourceRepository
    存储并允许访问共享资源。如果您使用IoC容器,那么问题可以通过其配置来解决
  • 嗯。我们决定我们真的有一节课。下一个问题是为什么需要检索
    IFoo
    的实例来使用其
    IBar
    方法?它无疑打破了面向对象的设计,而且每个解决方案都只是一个黑客。您应该创建
    BarFactory
    ,并使用、IoC容器等解决单实例问题
@HenkHolterman,我完全承认这是一个我不完全理解的原则!/\完全明白!是否可以创建一个工厂方法来返回一个对象Is,该对象既是IFoo又是IBar,这样它就可以访问这两个对象中的所有方法?
public static IFoo Create(string className)
{
     Type type = Type.GetType(className);
     return (IFoo)Activator.CreateInstance(type);
}
    public class SomeBase { /* common code */ }
    public class Foo : SomeBase, IFoo { /* IFoo impementation */ }
    public class Bar : SomeBase, IBar { /* IBar impementation */ }