例如,我有一个带有虚方法的抽象类
class A
{
public:
virtual void setColumn(int i, string s); // set column i to show string s
...
};
该类由其他一些抽象类派生,如B
和C
。
我发现A的大部分对象都遵循以下规则:它有2列:名称和描述。为了避免重复代码(实际情况更复杂,所以我想避免重复),我在A
中添加了2个虚拟方法,因为混凝土类具有setName()
和{{setDescription()
的不同实现1}}。
class A
{
public:
virtual void setColumn(int i, string s)
{
if (i == 0)
return setName(s);
if (i == 1)
return setDescription(s);
}
virtual void setName(string s);
virtual void setDescription(string s);
...
};
因此,如果具体类遵循规则,用户只需要重新实现setName()
和setDescription()
。如果没有,他们需要重新实施setColumn()
。但是,3个虚拟对象(setName()
和setDescription()
实现setColumn()
)让我觉得设计有问题。有什么好的设计吗?
答案 0 :(得分:2)
我在这里看不到任何抽象。
除非有与该问题相关的特定要求,否则只需在基类中定义一个public
容器。
struct A {
std::vector< std::string > columns;
enum columnIndex {
name = 0,
description = 1,
numCols
};
A() : columns( numCols ) {}
};
A foo;
foo.columns[ A::name ] = "Fido";
在C ++中添加更多样板文件通常不会为您提供更安全,更易于维护的程序。
答案 1 :(得分:1)
我认为你应该把它减少到两个层次:
class IHasColumns
{
public:
virtual void setColumn(int columnIndex, std::string value) = 0;
};
class IHasNameDescription : public IHasColumns
{
public:
virtual void setName(std::string name) = 0;
virtual void setDescription(std::string name) = 0;
private:
// Override
void setColumn(int columnIndex, std::string value)
{
if (i == 0)
return setName(value);
if (i == 1)
return setDescription(value);
}
};