首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >组成你继承的类的对象?

组成你继承的类的对象?
EN

Stack Overflow用户
提问于 2010-02-03 23:06:30
回答 2查看 277关注 0票数 2

我有一个类参数,它的目的是表示某个参数可能包含的值(实现两个关键方法,GetNumValues()和GetValue(int index))。

通常,一个逻辑参数(参数值是位标志)最好由parameter类的两个或多个实例表示(即,参数可以是1或2,参数可以是4或8,而不是一个参数可以是5、6、9或10)。为了处理这个问题,我想创建一个包含参数的CompositeParameter类,并根据它所包含的参数的组合实现GetNumValues()和GetValue()函数。

由于CompositeParameter将参数组合在一起,使它们充当单个参数,因此"CompositeParameter是参数“关系是有意义的。所以我发现自己处在这样的情况下,我有一个类,它由继承的类的对象组成,这看起来是不正确的。但同时,我不明白为什么更高级别的代码不能完全相同地对待CompositeParameters和参数。

我能想到的唯一选择就是让CompositeParameter简单地编写参数,而更高级别的代码将只处理CompositeParameters。然而,这有点浪费b/c一般的情况是CompositeParameters,它只包含一个参数。

有什么想法?

代码语言:javascript
运行
AI代码解释
复制
class Parameter
{
public:
    virtual unsigned int GetNumValues() const {...}
    virtual unsigned int GetValue(unsigned int index) const {...}
}

class CompositeParameter : public Parameter
{
public:
    // product of GetNumValues() of each item in mParamList
    virtual unsigned int GetNumValues() const {...} 

    // allow all the possible combinations of the items in mParamList to be
    // treated as one parameter. i.e. if mNumParams = 2, this would be analogous
    // to getting the row and col index of a matrix from index, and combining
    // the mParamList[0]->GetValue(row) and mParamList[1]->GetValue(col)
    virtual unsigned int GetValue(unsigned int index) const {...}

private:

    static const unsigned int MAX_PARAMS = 10;

    unsigned int mNumParams;
    const Parameter* mParamList[MAX_PARAMS];
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-03 23:49:08

代码语言:javascript
运行
AI代码解释
复制
I have a class which composes objects of a class it inherits from,
which just doesn't seem right.

这不就是复合体的定义吗?

代码语言:javascript
运行
AI代码解释
复制
(parameter values are bit flags)

这是我要质疑的设计部分。也许参数更好的名字应该是FlagSet?

将逐位测试隐藏在接口后面是很好的,但用基础计算机科学中众所周知的解决方案来解决问题,继承似乎有点过头了。

代码语言:javascript
运行
AI代码解释
复制
However, that is somewhat wasteful b/c the general case would be
CompositeParameters which contained just one Parameter.

复合模式的要点是,Leaf对象表示简单的情况,复合对象表示复杂的情况,客户端代码可以将这两种情况视为相同的情况。如果您的接口需要客户端代码来区分这两者,或者遍历基类组件,那么您并不能真正从使用模式中获得任何价值。

例如,如果您的主要关注点是测试,那么基类可以有一个方法:

代码语言:javascript
运行
AI代码解释
复制
bool Test() const;

叶类实现将如下所示:

代码语言:javascript
运行
AI代码解释
复制
bool LeafTester::Test() { return _DoTest(); }

复合类实现将如下所示:

代码语言:javascript
运行
AI代码解释
复制
bool CompositeTester::Test() {
    bool success = true;

    for (int i = 0; i < m_count; i++)
        success &= m_components[i].Test();

    return success;
}

客户端总是像这样使用代码:

代码语言:javascript
运行
AI代码解释
复制
// tester could be a Composite or a leaf, but we don't care:
bool testResult = tester.Test();

我使用了for循环来保持示例的简单性。在实践中,我会使用STL。

票数 1
EN

Stack Overflow用户

发布于 2010-02-03 23:15:58

这似乎是一个非常合理的设计。我要做的唯一更改是将Parameter从一个类更改为一个接口。

然后,您可以有一个实现参数的参数类(或者可能是一个ParameterImpl类),也可以有一个实现参数接口的CompositeParameter类

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2196205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档