【问题标题】:Correct way of implementing composition (Composition with interface ) [closed]实现组合的正确方法(带接口的组合)[关闭]
【发布时间】:2018-04-17 16:26:03
【问题描述】:

我对这些实现感到困惑。在一次采访中,面试官问我什么是组合,我给了他典型的定义,然后我为他写了这部分代码。

public class Foo {
    private Bar bar = new Bar(); 
}

但他声称这个实现是正确的

interface IFoo
{
    int DoSomthing();
}

class Bar : IFoo
{
    public int DoSomthing()
    {
        throw new NotImplementedException();
    }
}

哪个是正确的?

【问题讨论】:

  • 第二个只是一个实现接口的类。我没有看到那里的成分。这应该有助于geeksforgeeks.org/association-composition-aggregation-java
  • 我不是对你投反对票的人,但这可能是因为你没有表明你在提出问题之前已经付出了任何努力来研究组合优于继承的原则。您的第一个代码示例与组合没有任何关系。
  • 阅读this page,第一段和第一个例子可能会让它点击。

标签: c# oop interface


【解决方案1】:

编辑:我现在意识到你和你的面试官都是正确的;答案相应更新。

来自Composition over inheritance 上的维基百科页面:

组合优于继承...是类应该通过组合(通过包含实现所需功能的其他类的实例)而不是从基类继承来实现多态行为和代码重用的原则或父类。

Polymorphism

为不同类型的实体提供单一接口。

所以你所做的(让Bar 成为Foo 的属性)是组合,因为Bar 通过将Foo 作为属性来拥有一个实例。

你的面试官所做的也是组合,因为通过接口IFooBar 实现了相同的功能,并且它没有使用继承来这样做。这似乎是它在链接的 wiki 页面上记录的方式,但也不意味着您的方式是错误的。

您使用哪种方法在不同的地方实现相同的功能取决于Bar 作为Foo 的属性是否有意义。

【讨论】:

【解决方案2】:

组合表示对象之间的“is-a-part-of”关系。例如,

class Engine
{
    //....
}

class Car
{
    Engine engine = new Engine();
    //.....
}

我们可以看到,引擎是汽车的一部分。组合和继承是两个不同的概念,你可能不应该接受他将成为你老板的工作机会。 :)

【讨论】:

  • 在您的示例中,Car 实际上并未实现 Engine,它只是具有 Engine 类型的属性。 composition over inheritance 原则是关于引入多态行为的方法,换句话说,Car 是从 Engine 实现的。
  • 我意识到您的方法实际上也是一个组合示例(并相应地更新了我的答案),但是除非编辑答案,否则我不会让我从您的答案中删除我的反对票。
  • @levininja 刚刚编辑了它!
猜你喜欢
  • 2019-11-02
  • 2018-02-10
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2011-11-27
相关资源
最近更新 更多