正确实现组合的方式(带界面的组合)

时间:2018-04-17 16:26:04

标签: c# oop interface

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

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

但他声称这种实施是正确的

interface IFoo
{
    int DoSomthing();
}

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

哪一个是正确的?

2 个答案:

答案 0 :(得分:2)

组成表示"是...的一部分。对象之间的关系。例如,

class Engine
{
    //....
}

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

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

答案 1 :(得分:1)

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

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

  

继承上的组合......是这样的原则:类应该通过它们的组合实现多态行为和代码重用(通过包含实现所需功能的其他类的实例)而不是从基类继承或父母班。

Polymorphism

  

为不同类型的实体提供单一界面。

所以你做了什么(让Bar成为Foo的属性)是因为Bar通过将Foo作为属性来实现IFoo

您的采访者所做的也是撰写,因为通过界面BarBar实现了相同的功能,并且它没有使用继承来执行此操作。这似乎是它在链接的维基页面上记录的方式,但并不意味着你的方式也是错误的。

用于在不同位置实现相同功能的方法取决于Foo是否属于cache属性是否有意义。