在对象A中有一个类型为B的对象数组.B类有方法B1,B2,... B10
我希望对象A有一个方法,它返回一个指向B类型对象的指针,但只暴露方法B9-B10。调用者不应该知道方法B1-B8
当返回指向B类对象的指针时,如何隐藏方法B1-B8?我正在使用C ++
更新:
对象A需要访问B的所有方法,但A只会在A之外公开方法B9-B10。
答案 0 :(得分:1)
这似乎是Proxy Pattern.的一个地方.ProxyB类只暴露B9 - B10。
但是,在我看来,如果方法B9和B10足够,那么它们就会形成一个独特的界面。这两个方法应该是他们自己的类接口。如果B由方法B1-B8组成的BA和方法B9-B10的BB组成,则可以返回指向BB的指针。
答案 1 :(得分:0)
我能想到的一种方法是让另一个名为$user_last
的类,其构造函数使用类C
的对象,并仅提供方法B
和B9
。
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];
};
<强>摘要强>
以上所有都有其优点,并且都有其缺陷。我建议使用第二个或第三个选项,包装现有的类并提供一个公共接口,在合理范围内只能与所需的接口一起使用。