C ++:在基类

时间:2015-12-14 15:30:39

标签: c++ generics inheritance

目前我正在编写一个C ++程序,它应该包含一个非常通用的基类。哪个会有一些受保护的功能

class Base{
     virtual void doA() = 0;
     virtual void doB() = 0;
     \\[see below]...
}

它们将以异步方式执行,并在完成后立即将其称为回调:

 virtual void doACallback(type1 param1, type2 param2) = 0;
 virtual void doBCallback() = 0;

我的问题是doAdoB的实现对于每个子类都是不同的,并且回调方法应该能够接收不同的参数(类型和数量)。是否可以在基类中保存回调方法声明时进行管理?也许这可以通过另一种方式来实现。我还是C ++的新手。

注意:Base不仅包含纯虚函数。

编辑:因为有些人问道。我想定义子类的一般“外观”。我的具体情况非常复杂,但让我们尝试一个例子:

class Base{
  virtual void sendData() = 0;
  virtual void sendDataCallback() = 0;
}

class SubclassA:public Base{    
  void sendData() override{
       //send Data by using LibraryA
  }
  void sendDataCallback(ErrorCode aErrorCode) override{
     //handle error Code
  }    
}

class SubclassB:public Base{
  void sendData() override{
       //send Data by using LibraryB
  }
  void sendDataCallback(ErrorCode aErrorCode, Response aResponse) override{
     //handle error Code and handle response
  }    
}

这不是确切的情况,但也许这澄清了这个想法......

编辑2:如果有人想知道:最后我选择在子类中定义回调。

3 个答案:

答案 0 :(得分:1)

几乎所有东西都是可能的。您可以强制转换为format as json 'auto' timeformat 'YYYY-MM-DD HH:MI:SS';并返回派生类:

void*

但你为什么要这样做呢?这是一场维护噩梦。其他开发者会看起来像它,并立即想要自杀......或者你......或者更可能两者兼而有之。

你是否正在这样做,以便你可以分享"普通"代码('常见'在吓唬报价中,因为您可以看到它不是常用代码)。在OOP的早期阶段犯下的一个巨大错误就是认为继承,这样做是为了增加重用。这是错的。您可以通过合成来增加重用。

当你最终不得不重新实现多态性来做你正在尝试做的事情时,你可能会想到你可能做的事情并不是你应该做的事情。正在做。

答案 1 :(得分:1)

您是否考虑过使用Command模式作为回调? 派生类(从Base派生)应使用CommandA和CommandB类来执行所需的行为。

class Command
{
    public:
    virtual void execute() = 0;
};

class CommandA : public Command
{
    public:
    CommandA();
    void execute() override;
};

class CommandB : public Command
{
    public:
    CommandB(int param1, double param2);
    void execute() override;
};

然后是具体的课程:

class Concrete : public Base
{
    public:
    Concrete(Command* callA, Command* callB): callbackA(callA), callbackB(callB)
    {}
    void doA()override
    {
         ...
         callbackA->execute();
    }
    void doB()override
    {
         ...
         callbackB->execute();
    }
    private:
    Command* callbackA;
    Command* callbackB;
};

答案 2 :(得分:0)

不,那是不可能的。我也没有看到这一点。实现回调的子类必须从包含do函数的实际实现的类派生,所以我不明白为什么带有do实现的类不能声明回调函数。< / p>