【问题标题】:Design Pattern advice设计模式建议
【发布时间】:2011-01-19 23:08:53
【问题描述】:

我想知道是否有人可以帮助我。

假设我有一些类如下:

class A { ... };

class B : public A { ... }

class C : public A { ... };

class D { ... };

class E : public D { ... };

class F : public D { ... };

现在我希望 B 类有一个 E 类型的对象作为成员,而 C 类有一个 F 类型的对象作为成员。

是否有一个很好的设计模式,我可以在 A 类中拥有某种指向 D 类的基指针,然后在 B 类中创建一个新的 E,在 C 类中创建一个新的 F。我想知道抽象工厂是否相似? .

我希望这不会太混乱......没有UML图很难解释!

【问题讨论】:

  • 格式化您的代码。请在以后的帖子中自己做。
  • 听起来你应该重新考虑你的设计。
  • 如果您想为模式命名,那么它可能是一种受限制的策略形式,具体取决于对象的实际用途。我说受限制是因为尽管从 A 类的 POV 来看,成员可以是实现 D 的任何对象,但您的 B 和 C 类都将该对象限制为具体的成员变量,而不是从“外部”提供的任何对象。如果 B 和 C 之间的唯一区别是不同的成员变量,那么整个结构可以重新转换为基于策略的设计,即将 A 转换为模板,并将 B 替换为 A<E> 和 C 替换为A<F>.

标签: c++ oop design-patterns inheritance class-design


【解决方案1】:

完全按照你说的做有什么问题?

class A
{
    A(D* p) : ptr(p) {}
    D* ptr;
};

class B : public A
{
    B() : A(new E) {}
};

class C : public A
{
    C() : A(new F) {}
};

如果你想更好地自动化它,你可以使用一个中间模板类。

class A
{
    virtual D* getD();
};

template <class T>
class AImpl : public A
{
    AImpl() : m_d(new T) {}
    T* getD() { return m_d; }
    T* m_d;
};

class B : public AImpl<E> { };

class C : public AImpl<F> { };

请注意,AImpl::getD() 可以返回 T*,因为 covariant return types。

【讨论】:

  • 不过,这不是 CRTP。 CRTP 意味着将类本身作为模板参数提供给用作基础的类模板。您正在为用作基础的类模板提供一些其他类作为模板参数。
  • 嗯,是的,你是对的。出于某种原因,它对我来说就像 CRTP,我什至没有考虑过。我会纠正它。干杯。
【解决方案2】:

您完全可以这样做:

class D
{
public:
    D(const A *p) : p_(p) {}
    virtual ~D() { delete p_; }
private:
    const A *p_;
};

class E : public D
{
public:
    E() : D(new B) {}
};

有很多更好的方法可以解决这个问题,具体取决于您要实现的目标。例如,为什么D 需要包含指向A 的指针?

也许如果您编辑您的问题以更好地解释您的目标,那么我们可以提供更有洞察力的答案。

【讨论】:

  • Falmarri 说我应该重新考虑我的设计。您认为以上做法是好的做法还是会推荐其他方法?
  • @Mewzer:我不能说,因为我不知道你的目标是什么。
【解决方案3】:

复合设计模式怎么样?

http://en.wikipedia.org/wiki/Composite_pattern

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多