2016-09-16 13 views
0

私の質問に疑問を呈する仮想シナリオ:Matlabでクラスインスタンスをハンドルとして渡す方法

2つのエンティティ、つまり上司と従業員があるとします。従業員が仕事を完了するとき、従業員は人々に知らせることを望みます。この場合、上司の「種別」はメッセージを購読して何をすべきかを決定します。

他のどのクラスでも実装できる抽象メソッドを持つこのインターフェイスを実装しました。この中で(彼原因/彼女が彼/彼女が何をしたいのかを決定します):

classdef (Abstract) Interface < handle 

    methods 
     getJobsCompleted(n) 
    end 

end 

ボスクラスはメソッドgetJobsCompleted()

classdef Boss < Interface & handle 

    properties 
     myEmployee 
    end 

    methods 
     function this = Boss() 
      this.myEmployee = Employee(this) 

      this.myEmployee.doJobs(); 
     end 
     %My boss implements (i.e. decides what to do) the abstract method 
     function getJobsCompleted(n) 

      %DO SOMETHING with n 
     end 
    end 

end 

そして、最後に、従業員のインタフェースを継承して実装しますジョブを実行して上司に通知します。私は失敗しませんしようとしてきた何

classdef Employee < handle 

    properties 
     numJobsCompleted; 
     boss = [];%pointer or reference to Boss instance 
    end 

    methods 
     function this = Employee(myBoss) 
      this.boss = myBoss; %reference/pointer to my boss so I know who to notify 
     end 

     function doJobs() 
      %% do something then let boss know 
      this.numJobsCompleted = 40; 
      this.boss.getJobsCompleted(this.numJobsCompleted); 
     end 

    end 

end 

は、彼/彼女が通知するために、どのボスを知っているように、Employeeクラスへの参照を渡すことです。

すなわち

in Boss 
this.myEmployee = Employee(this) 

答えて

1

これは動作しますが、あなただけ明示的にすべてのメソッドへの入力引数としてオブジェクトインスタンスに同意する必要があります。あなたは、次の2つの関数定義を更新する必要があります:

function doJobs(this) 
function getJobsCompleted(this, n) 

言われていること、これを行うのより良い方法がevents and listenersを使用することであってもよいです。その後、従業員に「JobCompleted」イベントを発行させ、上司にその従業員全員のイベントを聞かせるようにします。これにより従業員は上司を追跡する必要がなくなります。

classdef Boss < handle 

    properties 
     Employees 
     Listeners 
    end 

    methods 
     function this = Boss(employees) 
      this.Employees = employees; 

      this.Listeners = addlistener(employees, 'JobCompleted', @this.onJobCompleted); 
     end 

     function onJobCompleted(this, employee, evnt) 
      fprintf('%s completed a job!\n', employee.Name); 
     end 
    end 
end 

Employee.m

classdef Employee < handle 

    properties 
     Name 
     CompletedJobs = 0 
    end 

    events 
     JobCompleted 
    end 

    methods 
     function this = Employee(name) 
      this.Name = name; 
     end 

     function doJob(this) 
      this.CompletedJobs = this.CompletedJobs + 1; 
      notify(this, 'JobCompleted') 
     end 
    end 
end 

など、それを使用します。

employees(1) = Employee('Fred'); 
employees(2) = Employee('Bill'); 

boss = Boss(employees); 

doJob(employees); 
doJob(employees(1)); 
関連する問題