Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 组合(相对于继承)不是非常乏味吗?_Oop_Inheritance_Composition - Fatal编程技术网

Oop 组合(相对于继承)不是非常乏味吗?

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个方法并转发到门或窗的方法是否正常 那似乎非常非常乏味。这是真的吗?很多资料表明,是的,

假设您有接口IBuilding和IDwelling,以及实现这两者的类房屋。它封装了建筑物和住宅:

class House implements IBuilding, IDwelling 
{
  private IBuilding building;
  private IDwelling dwelling;
}
如果IBuilding和IDwelling分别定义了15个方法,那么在House类中编写30个方法并转发到门或窗的方法是否正常

那似乎非常非常乏味。这是真的吗?很多资料表明,是的,这就是你要做的,但它们都使用了超级简单的例子,并不像我想象的那样在现实生活中让人望而生畏


或者有没有我不知道的更聪明的写作方式?

虽然这似乎是一个极端的例子,是的,写作是关于横向授权,大多数情况下,你必须明确地对授权进行编程。根据您正在编程的语言,您可能会发现这是一种很好的机制,可以在不编写“粘合代码”的情况下实现水平合成。你可能会发现这篇文章读得很好,解释了垂直重用的问题,以及为什么像traits这样的方法是一种替代方法


HTH

这似乎是一个极端的例子,是的,写作是关于横向授权,大多数时候,你必须明确地对授权进行编程。根据您正在编程的语言,您可能会发现这是一种很好的机制,可以在不编写“粘合代码”的情况下实现水平合成。你可能会发现这篇文章读得很好,解释了垂直重用的问题,以及为什么像traits这样的方法是一种替代方法


一定要这么乏味吗?没有,还有更聪明的方法吗?对

我能想到为什么你会使用这篇作文的三个原因:

  • 在对象之间建立“有”的关系
  • 创建某种包装类(decorator/proxy)
  • 绕过单一继承约束(如果它适用于您的语言)
  • 在这三种情况中,只有第二种情况可能需要将来自包装器类的每个调用转发到包装器类。即便如此,有些语言可能允许您创建所谓的“动态”代理,这样您就不必在外部类中为内部类中的每个方法创建一个方法来转发调用。例如,在Java中称之为
    动态代理类
    ,在PHP中称之为magic
    \uu call()
    方法

    另一件事是,像你在问题中描述的那种情况在实践中非常罕见

    更新


    这里的主要问题是,如果我们希望包装类实现包装类的接口,那么在使用PHP时,
    \uu call()
    方法确实不能真正帮助我们。如果接口只有很少的方法,那么实现它们并不困难,但是如果接口有15个呢?我相信,这个问题不是组合的问题,而是大接口的问题。要避免此类问题,您需要遵循以下步骤。不过,有时,如果您正在编写通用API,则很难遵循该原则。如果是这样的话,那么除了方法调用的一对一映射之外,您就没有什么可以做的了。对不起。

    一定要这么乏味吗?没有,还有更聪明的方法吗?对

    我能想到为什么你会使用这篇作文的三个原因:

  • 在对象之间建立“有”的关系
  • 创建某种包装类(decorator/proxy)
  • 绕过单一继承约束(如果它适用于您的语言)
  • 在这三种情况中,只有第二种情况可能需要将来自包装器类的每个调用转发到包装器类。即便如此,有些语言可能允许您创建所谓的“动态”代理,这样您就不必在外部类中为内部类中的每个方法创建一个方法来转发调用。例如,在Java中称之为
    动态代理类
    ,在PHP中称之为magic
    \uu call()
    方法

    另一件事是,像你在问题中描述的那种情况在实践中非常罕见

    更新


    这里的主要问题是,如果我们希望包装类实现包装类的接口,那么在使用PHP时,
    \uu call()
    方法确实不能真正帮助我们。如果接口只有很少的方法,那么实现它们并不困难,但是如果接口有15个呢?我相信,这个问题不是组合的问题,而是大接口的问题。要避免此类问题,您需要遵循以下步骤。不过,有时,如果您正在编写通用API,则很难遵循该原则。如果是这样的话,那么除了方法调用的一对一映射之外,您就没有什么可以做的了。抱歉。

    代码示例对我来说没有意义。为什么房子要封装建筑和住宅,特别是当它已经实现了它们的时候?这只是一个坏例子还是你的真实代码?如果是后者,我建议你考虑重新设计你的系统。对不起,是的,我写了一个坏的例子来尝试说明。我的观点基本上是:很多人写一个由其他类组成的类;这个类必须公开它所组成的类的许多方法;编写许多单独的“转发器”方法只是包装那些内部类,这是标准做法吗?代码示例对我来说没有意义。为什么房子要封装建筑和住宅,特别是当它已经实现了它们的时候?这只是一个坏例子还是你的真实代码?如果是后者,我建议你考虑重新设计你的系统。对不起,是的,我写了一个坏的例子来尝试说明。我的观点基本上是:很多人写一个由其他类组成的类;这个类必须公开它所组成的类的许多方法;编写许多单独的“转发器”方法是否是标准做法