将*interface*或*object*作为参数传递给函数会更好吗?

dem*_*key 6 language-agnostic oop parameters information-hiding interface

我试图说服一位同事,一个函数应该将接口作为参数,而不是对象本身.我认为小对象可以很好地传递,但对于大对象,我会给它们一个接口,只是通过i/f,而不是整个事情.

请注意,只会出现其中一个大类 - 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(); }
};
Run Code Online (Sandbox Code Playgroud)

Bra*_*lor 13

您在面向对象开发中学到的第一个原则之一:

编程到接口,而不是实现.

你指出"只有这些大类中的一个 - i/f永远不会用于不同的对象".在你的情况下这可能是真的,但我希望每次这样的陈述都是错的时候我都有镍.

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

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


Ran*_*pho 8

依赖倒置原则可以作为总结:这是更好地依赖于抽象比结核.

传递接口几乎总是比通过具体类更好.

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