限制访问接口的正确方法?

时间:2012-12-03 10:00:59

标签: c++

假设我有一个代表打印作业的类: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必须能够更改其状态因此,可以访问该界面。

我认为这应该是朋友应该使用的情况,但我一直避免使用它们作为一个固有缺陷的机制,因此不知道如何正确使用它们。

那么, 我是如何正确地做到的?

2 个答案:

答案 0 :(得分:1)

使用工厂并让工厂返回IPrintingJob的实例(最好包装在smart_ptr中)。 e.g:

 struct PrintingFactory {
   static auto create() -> std::unique_ptr<IPrintingJob> {
     return std::unique_ptr<IPrintingJob>(new CPrintingJob());//as there is currently no std::make_unique..
   }
 }

一旦必须使用JobControl,您只需通过std :: dynamic_pointer_cast投射指针。

答案 1 :(得分:0)

经过一番考虑,我决定:

  1. 这一切肯定比它的价值更麻烦;

  2. (略微修改)上述MFH的答案是唯一的,也是最好的方式。

  3. 感谢大家的投入,这当然具有启发性。