假设我有一个代表打印作业的类:CPrintingJob
. 它对正在打印的文档一无所知,只知道作业状态 - 作业是否排队、拒绝、继续等。
这个想法是每当需要进行一些打印时实例化这个类的一个对象,然后将其与其他数据一起传递给打印模块,然后作业的创建者检查其状态以查看打印情况。
假设CPrintingJob
继承了两个接口:
class IPrintingJob // this one is to check the job state
{
virtual TState GetState() const = 0;
// ... some other state-inquiring methods
class ICallback // job's owner is notified of state changes via this one
{
virtual void OnStateChange( const IPrintingJob& Job ) = 0;
};
};
和
class IPrintingJobControl // this one is for printing module to update the state
{
virtual void SetState( const TState& NewState ) = 0;
// ... some other state-changing methods
};
问题是,创建CPrintingJob
对象的类不应该有权访问IPrintingJobControl
,但是传递给的打印模块CPrintingJob
必须能够更改其状态,因此可以访问该接口。
我想这正是应该使用朋友的情况,但我一直避免将它们视为天生有缺陷的机制,因此不知道如何正确使用它们。
那么,我该如何正确地做到这一点呢?