隐藏方法的实例返回到呼叫者

Hide methods of instance returned to caller

本文关键字:呼叫者 返回 实例 方法 隐藏      更新时间:2023-10-16

在对象A中有一系列的对象。类B类具有B1,B2,... B10

我希望对象A具有将指针返回到B类型对象的方法,但仅揭示方法B9-B10。呼叫者不应知道方法B1-B8

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

更新:

对象A需要访问B的所有方法,但是A将仅在A。

之外揭示B9-B10的方法B9-B10

这似乎是代理模式的一个地方。ProxyB类只会暴露B9 -B10。

但是,我认为,如果方法B9和B10足够,那么它们会成为自己独特的界面。这两种方法应该是他们自己的类界面。如果B由BA组成B1 B1-B8和BB用方法B9-B10,则可以将指针返回到BB。

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

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对象,然后将指针返回到后对象:

class A{
    private:
        B arr[10]; // array of objects of B
    public:
        void method_a(){
            // let arr[3] be the object you want to return a pointer of
            C result {arr[3]};
            return &result;
        }

希望对您有帮助。

您这里有很多不同的选项,我们应该使用代理模式,除其中一个外,还有所有的陷阱。

基类

在这里,我们有一个具有4个成员功能的理论,微不足道的空基类。我们想暴露其中2个。

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到基类,这将使任何人都可以安全地将班级视为基类,从而有效地使派生的类a弱建议呈现。

私有继承,公开方法

这是我最喜欢的一堆,因为它可以防止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];
};

摘要

以上所有这些都有其优势,并且都有陷阱。我建议使用第二个或第三个选项,以包装现有类,并提出一个公共接口,该界面只能与所需的接口一起使用。