【问题标题】:Two different objects implement the same Interface in the same way - how to stay DRY两个不同的对象以相同的方式实现相同的接口 - 如何保持 DRY
【发布时间】:2020-02-19 13:46:00
【问题描述】:

我有接口:

保证函数getColor的IColored。

现在我有两个对象:
1. 法拉利
2. 红苹果

两者都以相同的方式实现此接口/功能。
(但不能从同一个对象继承 - 不允许多重继承)。

如何避免代码重复?

【问题讨论】:

    标签: delphi interface dry


    【解决方案1】:

    我猜你正在寻找的是对象聚合。

    查看TAggregatedObject。这个想法是有一个实现的对象 行为,并作为一个属性,它将接口函数委托给那个 内部对象。

    【讨论】:

      【解决方案2】:

      DRY 是一个原则。作为一项原则,其目的是引导您走向被认为是最佳实践的方向。但是,由于它“只是”一项原则,而不是一些牢不可破的法律,因此需要知道何时应用它,什么时候最好不要应用它。

      我对 DRY 原则的看法是,这并不是因为 2 个函数的实现完全相同,它们都不值得存在,因为完全相同的原因可以有多个具有相同值的常量 (ERROR_SUCCESS = NO_ERROR = SW_HIDE = 等等...)。语义和上下文很重要。

      如果您明天更改了 1 个实现,是否还需要更改另一个?如果答案是否定的,我不认为你真的违反了 DRY 原则,或者至少我不认为你应该在这种情况下应用 DRY 原则。

      当然,这一切都有些主观。

      【讨论】:

        【解决方案3】:

        如果我对您的理解正确,您不能 - 不完全是。但是你可以这样接近:

        TYPE
          IColored = INTERFACE('GUID')
                       FUNCTION getColor : TColor;
                     END;
        
          TFerrari = CLASS(IColored)
                       FUNCTION getColor: TColor;
                     END;
        
          TRedApple = CLASS(IColored)
                       FUNCTION getColor: TColor;
                     END;
        
        FUNCTION CommonFunction : TColor;
          BEGIN
            // Lots of code that ends with Result:=clRed
          END;
        
        FUNCTION TFerrari.getColor : TColor;
          BEGIN
            Result:=CommonFunction
          END;
        
        FUNCTION TRedApple.getColor : TColor;
          BEGIN
            Result:=CommonFunction
          END;
        

        即。将实际代码委托给对象层次结构之外的函数,以便您可以独立于 INTERFACE 实现调用它。

        这是我知道实现您正在寻找的东西的唯一方法(除了严重的低级黑客攻击)(最少的代码重复)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-07
          • 2014-10-25
          • 2015-03-23
          • 1970-01-01
          • 2014-07-01
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          相关资源
          最近更新 更多