【问题标题】:How best to let a user redefine a class method?如何最好地让用户重新定义类方法?
【发布时间】:2020-03-05 16:56:44
【问题描述】:

除了单个类A 之外,我有一个具有完全通用实现的库。该类只有一个函数int format(int i){},但不能按原样使用:format取决于每个不同的应用程序,需要用户自定义。特别是,format 有很多 if-then 语句需要为应用程序的环境正确设置。但是,该库的其余部分是完全通用的,并且可以与特定规范内的任何format 选择一起使用。

问题:让我的库的用户定义format 的工作方式的最佳方式是什么?这需要在代码级别完成(而不是仅使用配置文件)。

显而易见的想法是让用户直接在源代码上直接重写format 的定义,但这听起来不是最优雅的方式。

另一个想法是使用继承:让用户定义一个从A 继承的userA 类,然后隐藏format 函数。但是库的其余部分使用类A 而不是userA。此时,可以用类型名desiredA 替换A 的所有实例,然后让用户将该类型名定义为userA。这也不是很优雅。

一定有更好的方法来做到这一点吧?

【问题讨论】:

  • 有几种方法可以做到这一点,这取决于具体哪一种可能更好。需要权衡取舍。
  • 您应该更具体地说明您希望他们能够进行的更改类型。您只是在谈论数据类型,还是对库的结构进行整体更改?
  • @Andrew 函数的签名将始终相同,但实现会有所不同。图书馆不会发生其他变化
  • 你考虑过使用函数模板吗? programiz.com/cpp-programming/templates 似乎如果实施得当,这将实现您想要的。
  • format 的实施变化有多大?我们是在谈论一些数字参数,还是更激烈的事情,比如除了函数签名之外应用程序之间没有共享代码?可能的实现数量是否有限制,或者更像是没有两个应用程序会使用相同版本的format

标签: c++ class inheritance design-patterns


【解决方案1】:

这是我过去使用的一种方法。

  1. 添加让用户注册他们选择的功能的功能。
  2. 如果已注册用户定义函数,请调用它。否则,使用一些默认函数。
using UserFunctionType = int(*)(int i);
UserFunctionType registeredFunction = nullptr;
void registerUserFunction(UserFunctionType f) { registeredFunction = f; }

int format(int i)
{
   if ( registeredFunction ) 
   {
      return registeredFunction(i);
   }
   else
   {
      // Some default implementation
   }
}

用户代码类似于:

int myFunction(int i)
{
   // Return whatever makes sense.
}

int my_init()
{
   registerUserFunction(myFunction);
   return 0;
}

// Make sure my_init() gets called at program startup time.
static int dummy = my_init();

【讨论】:

  • 我对用户如何输入他们的功能感到有些困惑。他们是否制作了一个新的 header+cpp 文件,然后将其包含在我的库中?还是我只有一个空的 cpp 文件,他们可以在其中实现其功能?不就是让他们直接修改格式的源代码吗?
  • @user12005284,他们必须 1) 定义一个函数和 2) 注册该函数。这样做更好,因为您可以将代码作为库提供给用户。他们不必修改您的代码。
  • 对,但是注册需要在库的其余部分可以看到的文件中进行。它是如何工作的?
  • @user12005284,不,没有必要。这就是回调函数的工作原理。
  • 哦,我明白了,对不起,我很困惑。这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多