Mixins与C ++中的面向策略设计有何不同

问题描述 投票:1回答:2

我已经阅读了各种尝试用C ++解释Mixins的资源。

它们似乎都解释了Mixin的应用,它们似乎只不过是标准的面向策略的设计。

Link-1 Link-2

所以我的问题是:Mixins是否与Policy Oriented Design同义,或者是否有更多的Mixins及其在C ++中的应用程序?

c++ mixins c++-concepts
2个回答
0
投票

它们是各种类似的解决方案。 无论如何,通常它们旨在解决稍微不同的问题。

考虑以下课程:

template<PolicyDoX PX, PolicyDoY>
struct PolicyBased {
    void doSomething() {
        // ... A few operations
        PX::doX();
        // ... Some other operations
        PX::doY();
    }
};

这是一个基于政策的简单方法。关键概念是该类期望策略给出(让我说)接口。这是一个实现问题(他们将如何做到这一点),而不是实际提供的内容。 换句话说,该类的用户在功能方面不受给定策略的影响,因为PolicyBased在任何情况下都提供相同的接口。

另一方面,考虑一下:

struct X { int i; void f() {} }
struct Y { char c; void g() {} };
struct Z { void h() {} };

template<typename... T>
struct Mixin: T... {}

using Full = Mixin<X, Y, Z>;
using Partial = Mixin<X, Z>;

在这种情况下,当您使用不同的组件集时,mixin会更改其界面。该类本身并不期望任何给定的功能集,只是将它们提供给最终用户。 因此,mixin可以被视为一个存储桶,您可以在其中放置几乎所有组件以获得您的首选类型,并且该类型将具有严格依赖于所选组件的接口。

总结一下:

  • 策略定义了如何执行某些操作,但不会影响接受它们的类的接口。
  • Mixins同意创建一个具有自己的接口的新类型,该接口由用于定义mixin的组件集给出。

0
投票

你链接到我写的一篇文章(思考自下而上),所以我想我会插话。

Policy Based Design和C ++中的Mixins之间的相似之处在于,定义的最终类将继承自参数化的类。它们不同的地方是,Mixins形成一个链条,因此它们组成,而政策则有些独立。您可以将Mixins视为应用单个策略的情况,并且该策略具有策略(请注意递归以形成一系列策略)。

对我来说,Mixins的强大之处在于MixinA可以与Base交互,而如果MixinA和Base是单独的策略,它们就无法进行交互。这将使模式适合不同的情况。

© www.soinside.com 2019 - 2024. All rights reserved.