2

抱歉我的问题的标题令人费解,从概念上讲它很简单,但我找不到任何好的设计来做到这一点。

我有一个最终用户可以访问的基类:

class A {
private:
    // m is a functor
    Base* m;
};

class Base {
public:
    virtual void someInterface();
};

class DerivedT1 : public Base {
public:
    virtual void someInterface()
    {
        some_parameter++;
    }
private:
    int some_parameter; // how to set?
};

class DerivedT2 : public Base {
public:
    virtual void someInterface()
    {
        some_other_parameter += a_third_parameter;
    }
private:
    double some_other_parameter; // how to set?
    double a_third_parameter; // how to set?
};

我正在尝试找到最通用的方式来设置some_parametersome_other_parameter来自A的公共界面。

我曾想过给我的参数一个数字,但这听起来真的很难看。

有没有漂亮的面向对象的方法来做到这一点?

4

3 回答 3

2

你想使用 A 的公共接口来设置派生类参数:你可以在 A 中定义一个公共函数,它有一个 Base* 参数:

class A
{
public:
void setter(const Base *p);
{
     m = p;
}
};

如果你想设置Drived1你可以定义一个对象Derived1,可以将它传递给setter;我想你想用A的public函数传值,你必须知道指针的类型Base*,所以你可以通过Derived1or的构造函数传值Derived2

于 2013-08-02T09:21:26.417 回答
1

我没有其他工作,你总是可以使用动态演员:

DerivedT1 *d1 = dynamic_cast<DerivedT1>(m);
if (d1 != nullptr)
{
    // do something with derived 1
}
else
{
    DerivedT2 *d2 = dynamic_cast<DerivedT2>(m);
    if (d2 != nullptr)
    {
        // do something with derived 2
    }
}

但如果你需要它,这通常表明你的设计有问题。

于 2013-08-02T09:29:27.453 回答
0

如果你想按照这些思路做一些事情

A a; a.setAlgorithmFamily(Algorithm::Type1);
a.getAlgorithmImplementation().setSomeParameter(34);

这是一个快速而肮脏的例子,说明你如何做到这一点。A::setAlgorithmType 基本上是最简单形式的工厂模式。

nclude <iostream>
using namespace std;

class Algorithm {
public:
   virtual void setParameter(int value) = 0;
};
class AlgoX : public Algorithm {
   int mX;
public:
   void setParameter(int value) {
      cout <<"Setting X to " <<value <<endl;
      mX = value;
   }
};
class AlgoY : public Algorithm {
   int mY;
public:
   void setParameter(int value) {
      cout <<"Setting Y to " <<value <<endl;
      mY = value;
   }
};
class A {
public:
   void setAlgorithmType(std::string type) {
      cout <<"Now using algorithm " <<type <<endl;
      if(type == "X")
         mAlgorithm = new AlgoX();
      else if(type == "Y")
         mAlgorithm = new AlgoY();
   }
   Algorithm* getAlgorithmImplementation() { return mAlgorithm; }
private:
   Algorithm* mAlgorithm;
};

int main(int argc, char** argv) {
   A a;
   a.setAlgorithmType("X");
   a.getAlgorithmImplementation()->setParameter(5);
   return 0;
}

这给出了:

Now using algorithm X
Setting X to 5
于 2013-08-02T09:45:16.760 回答