印刷ジョブを表すクラスがあるとしましょう: CPrintingJob
. 印刷中のドキュメントについては何も認識せず、ジョブの状態 (ジョブがキューに入れられたか、拒否されたか、続行されたかなど) だけを認識します。
このクラスのオブジェクトは、印刷を行う必要があるたびにインスタンス化され、他のデータとともに印刷モジュールに渡され、ジョブの作成者がその状態をチェックして印刷がどのように進行しているかを確認するという考え方です。
が 2 つのインターフェース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
はその状態を変更できる必要があるため、そのインターフェイスにアクセスできる必要があります。
これはまさに友達を使うべきケースだと思いますが、本質的に欠陥のあるメカニズムとして友達をいつも避けてきたので、友達を適切に使う方法がわかりません。
では、どうすれば適切に行うことができますか?