两个不同的对象以相同的方式实现相同的接口——如何保持 DRY

Two different objects implement the same Interface in the same way - how to stay DRY

我有接口:

保证函数 getColor 的 IColored。

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

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

您将如何避免代码重复?

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

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 实现调用它。

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

我猜你要找的是对象聚合。

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

DRY 是一个原则。作为一项原则,其目的是指导您采用被认为是最佳实践的方法。但是,由于它是 "just" 一项原则而非牢不可破的法律,因此需要知道何时应用它,何时应用它更可取。

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

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

当然,所有这些都带有主观色彩。