【问题标题】:Interface injection接口注入
【发布时间】:2009-09-11 06:09:10
【问题描述】:

是否可以将接口注入到我无法更改的现有 3rd 方类中?与扩展方法类似,但用于接口(及其注入到的类的实现)。

我喜欢通过为两个库中相似的类提供相同的接口来选择性地使用两个相似的第 3 方库之一。这样我就不必将那里的课程转换为我的课程。

【问题讨论】:

  • 我也喜欢这个。不久前我在博客上写过:madprops.org/blog/…
  • 很遗憾,类在事后无法适应接口,就像在 Haskell 中使用类型和类型类所做的那样。

标签: c# .net interface


【解决方案1】:

我不完全理解你所说的注入接口是什么意思,但你可以使用Adapter 模式来实现这一点。另见:http://dofactory.com/Patterns/PatternAdapter.aspx

创建您自己的接口,然后创建您自己的实现该接口的类,其中包含/包装第 3 方类。

【讨论】:

    【解决方案2】:

    只要您在处理接口,为什么不将类包装在您自己的实现接口的类中?

    【讨论】:

      【解决方案3】:

      您应该查看Decorator Pattern,它允许您通过组合扩展一个类。

      例如 给定实现 InterfaceA 的密封类 A:

      public interface InterfaceA
      {
          int A {get; set;}
      }
      
      public sealed Class A : InterfaceA
      {
          public int A {get;set;}
      }
      

      您可以扩展 InterfaceA,然后使用装饰器类 B 来封装类 A 的实例并提供其他方法。

      public interface MyExtendedInterfaceA : InterfaceA
      {
          int B {get;set}
      }
      
      public class B : MyExtendedInterfaceA
      {
          private InterfaceA _implementsA = new A();
      
          public int A
          {
              get
              {
                  return _implementsA.A;
              }
              set
              {
                  _implementsA.A = value;
              }
          }
      
          public int B {get; set;}
      }
      

      或者,装饰器 Class C 可以添加一个全新的接口:

      public interface InterfaceC
      {
         int MethodC();
      }
      
      public class C : InterfaceA, InterfaceC
      {
      private InterfaceA _implementsA = new A();
      
          public int A
          {
              get
              {
                  return _implementsA.A;
              }
              set
              {
                  _implementsA.A = value;
              }
          }
      
          public int MethodC()
          {
              return A * 10;
          }
      }
      

      【讨论】:

      • 看来您没有仔细阅读我的问题。如果 A 类是第 3 方库类之一,我将无法添加 InterfaceA。
      • 看来你误解了我的意思;我正在概述可以在您自己的代码或第 3 方库中的 A 类结构。无论哪种方式,它都是密封的,您无法更改它。 B 类和 C 类是您在自己的类中编写的代码。
      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2023-03-23
      • 2017-06-10
      • 2012-05-02
      • 2017-07-14
      相关资源
      最近更新 更多