4

我试图说服一个同事,一个函数应该把接口作为参数,而不是对象本身。我认为小对象可以很好地通过,但对于大对象,我会给他们一个接口,只是通过I/F,而不是整个事情。将* interface *或* object *作为参数传递给函数会更好吗?

请注意,只有这些大类中的一个 - i/f将永远不会用于不同的对象。这仅仅是为了隐藏对象的实现。

你是否同意将一个大类分离为一个接口是一种好的做法?
这样做有什么缺点吗?

实施例:

public interface class IVeryLargeClass 
{ 
    void DoSomething(); 
    ... 
}; 

public ref class VeryLargeClass : public IVeryLargeClass 
{ 
public: 
    virtual void DoSomething() { ... } 
    ... 
}; 

public ref class AnotherClass 
{ 
public: 
    AnotherClass(VeryLargeClass^ vlc) { vlc->DoSomething(); } 
// OR 
    AnotherClass(IVeryLargeClass^ vlc) { vlc->DoSomething(); } 
}; 
+2

下面的答案很好,但你应该明白,对象的“大小”与这个主题无关。 “大”班或“小班”与本次讨论无关。该接口用于隐藏实现。这根本不是性能问题。 – Bill 2009-06-17 10:19:10

+0

@Bill - 在这种情况下,我确实同意你的大小并不重要(ahem),我只是用一个大类来说明将一个巨大的对象传递给一个想要使用其中的一个或两个函数的类。 – demoncodemonkey 2009-06-17 10:43:26

回答

12

一个你在OO学习发展的首要原则:

计划到接口,而不是 实现。

您指出“只会有这些大类中的一个 - i/f永远不会用于不同的对象”。你的情况可能是这样,但是我希望我每次发现这样的声明都是错的。

除了考虑是否可能存在多个接口的实现之外,还应该考虑具体对象是否导出(或可能导出)与接口中声明的操作不共享逻辑关系的其他方法。在这种情况下,您可以简单地在一个或多个其他接口中声明额外的操作。那么,客户端只需要与导出其感兴趣的操作的接口结合。

简而言之,接口提供了一种管理客户端和提供者之间耦合的方法。

7

Dependency Inversion Principle可以概括为:这是更好地依赖于抽象比结核。

传递接口几乎总是比传递具体类更好。

也就是说,对于内部类型的高凝聚力在特定模块内是可以的,但对于何时以及如何传递具体对象这是非常主观的。

3

如果你通过一个实现,你会发现使用接口的优点之一,这意味着将逻辑从实际实现中分离出来。

一个软件模块A 的接口被故意从 执行该模块的保持独立。所述 后者包含在 接口,以及其他 “私有”的变量,程序等所描述的 程序和方法的实际代码.. 任何其他软件模块B(其可以 被称为客户端到A) 与A交互只能通过接口强制执行 。这 安排的一个 实用的优点是,通过一个又一个 满足的 相同规格的接口应该不会造成B到 更换 执行情况的失败,只要其使用A符合 与规格 接口(另请参阅Liskov 替代原理)。

http://en.wikipedia.org/wiki/Interface_(computer_science)

3

我宁愿避免创建接口的缘故创建和接口。如果你可以在多个地方使用该接口,那么你就有一个赢家 - 或者如果这是一个公共职能和课程,并且你特别想简化。

1

另一个问题是你的非常大的类本身。这可能不在你正在做的事情的范围内,但是一个非常大的班级意味着它可能首先做的太多了。你可以把它重构成更小的类,你调用的函数中所需的信息是封装在它自己的小类中的吗?如果您针对该类创建了一个接口,那么您可能会发现它比您当前拥有的非常大的类更具可重用性。

相关问题