【问题标题】:interface & inheritance接口和继承
【发布时间】:2011-05-13 17:36:29
【问题描述】:

C#,VS 2008 我有 4 个案例说 a、b、c、d,我打算将它们分开并创建单独的类 这 4 种情况有一些共同点,我将它们放在一个接口中并创建一个实现该接口的基类。现在 a&b、a&c、c&d 之间有一些共同点,不知道如何制作一个好的/干净的工具

谢谢

【问题讨论】:

  • 你能举出更具体的例子来说明你在做什么吗?这将有助于决定如何进行。
  • 目前无法回答您的问题,因为它太模糊了。请举一个具体的例子。
  • 您确定继承(“is a”)是正确的方法吗?也许“有一个”更适合?同样,更多细节会有所帮助。
  • 对不起。我有 4 个用于 Excel 插件 A、B、C、D 的 UDF,它们使用 Web 服务在 excel 中请求数据和绘制数据。每个函数使用不同的 Web 服务调用(URL&payload)。有一些可选参数适用于所有功能,如排序顺序、显示摘要等。有些选项只能适用于 A&B、A&C、C&D。在我使用 if/switch 语句的地方,我有一门课来处理这个问题。我想清理代码,我从类调用IFunc中提取一个接口,并创建了一个基类BaseFunc,我正在考虑创建一个从BaseFunc,Func_A,Func_B继承自Func_A_B_Common的类Func_A_B_Common
  • Func_A_C_Common,Func_A需要继承自Func_A_B_Common & Func_A_C_Common,但是C#是单继承的,函数C也一样,不知道怎么处理好

标签: c# oop interface inheritance


【解决方案1】:

有多种选择。

你可以让 c 和 d 从 a 继承,而 d 从 c 继承。 您可以为每对 a/b、a/c 和 c/d 创建一个基类。 您可以复制功能。 您可以通过辅助类提供功能(静态方法可能是一种选择)。

这实际上取决于共享的功能以及类的预期用途。

【讨论】:

    【解决方案2】:

    这取决于常见事物的工作方式以及它们与私有/受保护数据的关联和使用方式,但组合通常可以作为继承的补充或替代。

    从 a、b、c 和 d 的不同实现中将常用部分分解为您使用的辅助类。

    这只有在实现没有与每个类的私有数据紧密耦合时才有可能。

    【讨论】:

    • 现在它们紧密耦合并纠缠在一个类中。我想把它们分开,也不想在单独的类中重复代码。我刚开始清理,发现很难解耦
    【解决方案3】:

    作为一般规则,只有当您的对象是同一对象的不同种类时,您才应该使用继承。如果是这种情况,那么您可以使用继承来共享基础对象定义中固有的实现。

    如果 a、b、c 和 d 类并不是同一个对象的不同种类,那么您可以尝试将它们的通用功能封装在一个内部引用的对象中。

    public class a
    {
        private CommonFunctionalityClass commonFunc;
    
        public a()
        {
            this.commonFunc = new CommonFunctionalityClass();
        }
    } 
    

    当你想做一些普通的事情时,你只需调用你的 commonFunc 实例。您可以对 a/b、b/c 和 c/d 执行相同的封装,在其中通过 a 共享功能时,使用内部引用的对象具有关系。这样您就不会重复代码,但您可以灵活地共享功能。

    【讨论】:

      【解决方案4】:
      public interface IABInterface
      {
          //Whatever is common to A and B. It will have to be implemented in the classes
      }
      
      public interface IACInterface
      {
          //Whatever is common to A and C. It will have to be implemented in the classes
      }
      
      public interface ICDInterface
      {
          //Whatever is common to C and D. It will have to be implemented in the classes
      }
      
      public class ABCDBase
      {
          //Whatever is common to all classes
      }
      
      public class A : ABCDBase, IABInterface, IACInterface
      {
      }
      
      public class B : ABCDBase, IABInterface
      {
      }
      
      public class C : ABCDBase, IACInterface, ICDInterface
      {
      }
      
      public class D : ABCDBase, ICDInterface
      {
      }

      您可以稍后在静态类中为您的接口创建扩展方法,以免在接口实现中复制您的方法的代码(换句话说,不要在接口中定义方法,只定义属性)。通过重构可以很容易地在你的接口中实现属性。 拥有扩展属性会很好。未来充满希望。

      编辑

      像这样:

      public static class Helper
      {
          public static void IABMethod1(this IABInterface aOrBObject, arguments args)
          {
              //This will be available for any A or B object without duplicating any code
          }
      }

      【讨论】:

      • @Arturo,谢谢。在您的提案中,A、B 都必须实现重复的 IABInterface。我在想公共课 ABBase : ABCDBase, IABInterface{};公共类ACBase:ABCDBase,IACInterface{};那么公共类A需要从classABBase,ClassACBase继承,这在C#中是不可能的,所以我会尝试组合(has-a)。谢谢
      • 这不是很干净,因为你也想创建public class ACBase : ABCDBase : IACInterface { },你不能像public class A : ABBase, ACBase { }一样继承A
      • 如果你为你的接口使用扩展方法,你就没有问题了。这是在您的案例中使用接口的好处,并且您不会复制任何代码。
      • @Arturo,谢谢。我使用了扩展,但不知道我可以这样做。凉爽的。谢谢,我试试看
      • @Arturo,还有一个问题,我有一些 A & B 共有的私有数据,为了避免重复,我正在考虑将其更改为 public 并将其放入接口 IABBase,是否有更好的方法?谢谢
      猜你喜欢
      • 2010-09-21
      • 2011-07-31
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多