我对这些实现感到困惑。在一次采访中,面试官问我构成是什么,我给了他典型的定义,然后我为他写了这部分代码。
public class Foo {
private Bar bar = new Bar();
}
但他声称这种实施是正确的
interface IFoo
{
int DoSomthing();
}
class Bar : IFoo
{
public int DoSomthing()
{
throw new NotImplementedException();
}
}
哪一个是正确的?
答案 0 :(得分:2)
组成表示"是...的一部分。对象之间的关系。例如,
class Engine
{
//....
}
class Car
{
Engine engine = new Engine();
//.....
}
我们可以看到,Engine是汽车的一部分。构成和继承是两个不同的概念,你可能不应该接受他将成为你老板的工作机会。 :)
答案 1 :(得分:1)
编辑:我现在意识到你和你的面试官都是正确的;答案相应更新。
来自Composition over inheritance上的维基百科页面:
继承上的组合......是这样的原则:类应该通过它们的组合实现多态行为和代码重用(通过包含实现所需功能的其他类的实例)而不是从基类继承或父母班。
为不同类型的实体提供单一界面。
所以你做了什么(让Bar
成为Foo
的属性)是因为Bar
通过将Foo
作为属性来实现IFoo
。
您的采访者所做的也是撰写,因为通过界面Bar
,Bar
实现了相同的功能,并且它没有使用继承来执行此操作。这似乎是它在链接的维基页面上记录的方式,但并不意味着你的方式也是错误的。
用于在不同位置实现相同功能的方法取决于Foo
是否属于cache
属性是否有意义。