【问题标题】:passing interface or reference to a function as parameter将接口或对函数的引用作为参数传递
【发布时间】:2016-08-17 11:38:55
【问题描述】:

我有包装类,我已经将它的对象传递给一个函数。

class wrapper
{
/// some functionality
}

什么会更好地作为类的引用传递,比如

fun(wrapper & ob)

或由包装器继承的新接口,如:

class Interface
{
}
 ....
class wrapper:public Interface
 ...
fun(Interface& ob)

【问题讨论】:

  • “更好”是什么意思?

标签: c++ oop parameters


【解决方案1】:

如果您希望您的函数仅接受 wrapper 类的实例,请使用

fun(wrapper& ob)

fun(const wrapper& ob)

如果你不打算修改它。

如果您希望您的函数接受任何实现 Interface 类的东西(仅当有更多类而不是 wrapper 继承自 Interface 时才真正有用),然后使用:

fun(Interface& ob)

fun(const Interface& ob)

选择取决于用例。

【讨论】:

  • 如果我在包装器类 2 中具有公共函数类包装器 {public: fun1();乐趣2();但我想在函数 fun 中只使用 fun1 是否更好地指定接口
  • @VladimirYanakiev 首先考虑界面本身的设计,而不是您今天拥有的特定使用场景 (fun)
【解决方案2】:

如果满足以下条件,Interface 方法会更好:

  1. 您希望关注Liskov substitution principle 并能够在将来将wrapper 替换为实现Interface 的其他类
  2. 您想对 fun 的用户隐藏 wrapper 的实现 - 即您不需要在 fun 声明之前#include wrapper.h
  3. 等等..

一般最好使用Interface 从接口抽象实现,但也不要忘记“not pay for what you don't use” 原则,即如果你知道你不需要任何实现Interface 除了wrapper 很快和wrapper.h #inclusion 对你的项目来说不是问题,而不是Interface 将是over-design

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多