【发布时间】:2020-02-19 13:46:00
【问题描述】:
我有接口:
保证函数getColor的IColored。
现在我有两个对象:
1. 法拉利
2. 红苹果
两者都以相同的方式实现此接口/功能。
(但不能从同一个对象继承 - 不允许多重继承)。
如何避免代码重复?
【问题讨论】:
我有接口:
保证函数getColor的IColored。
现在我有两个对象:
1. 法拉利
2. 红苹果
两者都以相同的方式实现此接口/功能。
(但不能从同一个对象继承 - 不允许多重继承)。
如何避免代码重复?
【问题讨论】:
我猜你正在寻找的是对象聚合。
查看TAggregatedObject。这个想法是有一个实现的对象
行为,并作为一个属性,它将接口函数委托给那个
内部对象。
【讨论】:
DRY 是一个原则。作为一项原则,其目的是引导您走向被认为是最佳实践的方向。但是,由于它“只是”一项原则,而不是一些牢不可破的法律,因此需要知道何时应用它,什么时候最好不要应用它。
我对 DRY 原则的看法是,这并不是因为 2 个函数的实现完全相同,它们都不值得存在,因为完全相同的原因可以有多个具有相同值的常量 (ERROR_SUCCESS = NO_ERROR = SW_HIDE = 等等...)。语义和上下文很重要。
如果您明天更改了 1 个实现,是否还需要更改另一个?如果答案是否定的,我不认为你真的违反了 DRY 原则,或者至少我不认为你应该在这种情况下应用 DRY 原则。
当然,这一切都有些主观。
【讨论】:
如果我对您的理解正确,您不能 - 不完全是。但是你可以这样接近:
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 实现调用它。
这是我知道实现您正在寻找的东西的唯一方法(除了严重的低级黑客攻击)(最少的代码重复)。
【讨论】: