Oop 组合(相对于继承)不是非常乏味吗?
假设您有接口IBuilding和IDwelling,以及实现这两者的类房屋。它封装了建筑物和住宅:Oop 组合(相对于继承)不是非常乏味吗?,oop,inheritance,composition,Oop,Inheritance,Composition,假设您有接口IBuilding和IDwelling,以及实现这两者的类房屋。它封装了建筑物和住宅: class House implements IBuilding, IDwelling { private IBuilding building; private IDwelling dwelling; } 如果IBuilding和IDwelling分别定义了15个方法,那么在House类中编写30个方法并转发到门或窗的方法是否正常 那似乎非常非常乏味。这是真的吗?很多资料表明,是的,
class House implements IBuilding, IDwelling
{
private IBuilding building;
private IDwelling dwelling;
}
如果IBuilding和IDwelling分别定义了15个方法,那么在House类中编写30个方法并转发到门或窗的方法是否正常
那似乎非常非常乏味。这是真的吗?很多资料表明,是的,这就是你要做的,但它们都使用了超级简单的例子,并不像我想象的那样在现实生活中让人望而生畏
或者有没有我不知道的更聪明的写作方式?虽然这似乎是一个极端的例子,是的,写作是关于横向授权,大多数情况下,你必须明确地对授权进行编程。根据您正在编程的语言,您可能会发现这是一种很好的机制,可以在不编写“粘合代码”的情况下实现水平合成。你可能会发现这篇文章读得很好,解释了垂直重用的问题,以及为什么像traits这样的方法是一种替代方法
HTH这似乎是一个极端的例子,是的,写作是关于横向授权,大多数时候,你必须明确地对授权进行编程。根据您正在编程的语言,您可能会发现这是一种很好的机制,可以在不编写“粘合代码”的情况下实现水平合成。你可能会发现这篇文章读得很好,解释了垂直重用的问题,以及为什么像traits这样的方法是一种替代方法
嗯一定要这么乏味吗?没有,还有更聪明的方法吗?对 我能想到为什么你会使用这篇作文的三个原因:
动态代理类
,在PHP中称之为magic\uu call()
方法
另一件事是,像你在问题中描述的那种情况在实践中非常罕见
更新
这里的主要问题是,如果我们希望包装类实现包装类的接口,那么在使用PHP时,
\uu call()
方法确实不能真正帮助我们。如果接口只有很少的方法,那么实现它们并不困难,但是如果接口有15个呢?我相信,这个问题不是组合的问题,而是大接口的问题。要避免此类问题,您需要遵循以下步骤。不过,有时,如果您正在编写通用API,则很难遵循该原则。如果是这样的话,那么除了方法调用的一对一映射之外,您就没有什么可以做的了。对不起。一定要这么乏味吗?没有,还有更聪明的方法吗?对
我能想到为什么你会使用这篇作文的三个原因:
动态代理类
,在PHP中称之为magic\uu call()
方法
另一件事是,像你在问题中描述的那种情况在实践中非常罕见
更新
这里的主要问题是,如果我们希望包装类实现包装类的接口,那么在使用PHP时,
\uu call()
方法确实不能真正帮助我们。如果接口只有很少的方法,那么实现它们并不困难,但是如果接口有15个呢?我相信,这个问题不是组合的问题,而是大接口的问题。要避免此类问题,您需要遵循以下步骤。不过,有时,如果您正在编写通用API,则很难遵循该原则。如果是这样的话,那么除了方法调用的一对一映射之外,您就没有什么可以做的了。抱歉。代码示例对我来说没有意义。为什么房子要封装建筑和住宅,特别是当它已经实现了它们的时候?这只是一个坏例子还是你的真实代码?如果是后者,我建议你考虑重新设计你的系统。对不起,是的,我写了一个坏的例子来尝试说明。我的观点基本上是:很多人写一个由其他类组成的类;这个类必须公开它所组成的类的许多方法;编写许多单独的“转发器”方法只是包装那些内部类,这是标准做法吗?代码示例对我来说没有意义。为什么房子要封装建筑和住宅,特别是当它已经实现了它们的时候?这只是一个坏例子还是你的真实代码?如果是后者,我建议你考虑重新设计你的系统。对不起,是的,我写了一个坏的例子来尝试说明。我的观点基本上是:很多人写一个由其他类组成的类;这个类必须公开它所组成的类的许多方法;编写许多单独的“转发器”方法是否是标准做法