隐藏返回给调用者的实例方法

时间:2017-12-24 20:13:48

标签: c++ class wrapper

在对象A中有一个类型为B的对象数组.B类有方法B1,B2,... B10

我希望对象A有一个方法,它返回一个指向B类型对象的指针,但只暴露方法B9-B10。调用者不应该知道方法B1-B8

当返回指向B类对象的指针时,如何隐藏方法B1-B8?我正在使用C ++

更新:

对象A需要访问B的所有方法,但A只会在A之外公开方法B9-B10。

3 个答案:

答案 0 :(得分:1)

这似乎是Proxy Pattern.的一个地方.ProxyB类只暴露B9 - B10。

但是,在我看来,如果方法B9和B10足够,那么它们就会形成一个独特的界面。这两个方法应该是他们自己的类接口。如果B由方法B1-B8组成的BA和方法B9-B10的BB组成,则可以返回指向BB的指针。

答案 1 :(得分:0)

我能想到的一种方法是让另一个名为$user_last的类,其构造函数使用类C的对象,并仅提供方法BB9

B10

然后你的class C { private: B B_object; public: C(B i_obj){ B_object = i_obj; } void B9_wrapper(){ B_object.B9(); } void B10_wrapper(){ B_object.B10(); } } 方法会返回一个指针(让我们将它命名为A),必须将a_method的对象转换为B的对象然后返回指向后一个对象的指针:

C
希望它对你有所帮助。

答案 2 :(得分:0)

你在这里有很多不同的选择,我们应该使用代理模式,除了其中一个之外,还有一些陷阱。

基类

这里我们有一个理论上,简单的空基类,有4个成员函数。我们希望揭露其中的两个。

class Base
{
public:
    void b1() {};
    void b2() {};
    void b3() {};
    void b4() {};
};

公共继承,隐藏方法

如果我们希望公开许多方法,但只有少数我们希望隐藏,那么使用公共继承可能很诱人,然后在派生类中隐藏一些方法。例如:

class Derived1: public Base
{
public:
    char* x() { return x_; }

private:
    using Base::b3;
    using Base::b4;

    char x_[2];
};

我建议不要这样做,因为它允许static_cast到基类,这将允许任何人安全地将类视为基类,有效地使派生类成为弱建议。

私有继承,公开方法

这是我最喜欢的,因为它阻止static_cast访问基类,并依赖于隐式的,reinterpret_cast或C风格的转换尝试访问基类(它仍然受到标准的保证,但却是一个更强大的建议。)

class Derived2: private Base
{
public:
    using Base::b1;
    using Base::b2;
    char* x() { return x_; }

private:
    char x_[2];
};

<强>包装/适配器

这最后一次尝试阻止了对基类的所有访问,因此提供了最强的保证,但这样做可能会增加类的大小(仅当基类为空时):

class Wrapper1
{
public:
    void b1() { b_.b1(); }
    void b2() { b_.b2(); }
    char* x() { return x_; }

private:
    Base b_;
    char x_[2];
};

<强>摘要

以上所有都有其优点,并且都有其缺陷。我建议使用第二个或第三个选项,包装现有的类并提供一个公共接口,在合理范围内只能与所需的接口一起使用。