首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将类实例作为句柄在Matlab中传递

如何将类实例作为句柄在Matlab中传递
EN

Stack Overflow用户
提问于 2016-09-16 14:33:58
回答 1查看 66关注 0票数 0

一个假设的场景来问我的问题:

假设我们有两个实体:一个老板和一个雇员。当员工完成一项工作时,他/她想让人们知道。在这种情况下,老板会订阅消息并决定该做什么

我实现了这个接口,它具有任何其他类都可以实现的抽象方法。在这种情况下(因为他/她将决定他/她想做什么):

代码语言:javascript
复制
classdef (Abstract) Interface < handle

    methods
        getJobsCompleted(n)
    end

end

boss类继承接口并实现方法getJobsCompleted()

代码语言:javascript
复制
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

最后,员工执行工作并通知老板。

代码语言:javascript
复制
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

我一直试图做的是传递一个对雇员类的引用,以便他/她知道该通知哪个老板。

代码语言:javascript
复制
in Boss
this.myEmployee = Employee(this)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-16 14:45:16

这是可行的,您只需要显式地接受对象实例作为所有方法的输入参数。您需要更新以下两个函数定义:

代码语言:javascript
复制
function doJobs(this)
function getJobsCompleted(this, n)

尽管如此,更好的方法可能是使用事件和听众。然后,您将让员工发出"JobCompleted“事件,并让老板为他们的所有员工收听这些事件。这就避免了员工需要跟踪他们的老板。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

并把它当作:

代码语言:javascript
复制
employees(1) = Employee('Fred');
employees(2) = Employee('Bill');

boss = Boss(employees);

doJob(employees);
doJob(employees(1));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39534084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档