【问题标题】:Matlab Object Oriented composition, aggregationMatlab面向对象的组合,聚合
【发布时间】:2012-06-15 02:20:41
【问题描述】:

我正在编写我的第一个 MATLAB O-O 应用程序,但我对组合、聚合和关系的一般实现感到困惑。

我的问题是:如何在matlab中实现聚合或关联一对多?我可以在哪里举一些例子?

另外,我正在使用 ArgoUml 来设计我的应用程序,matlab 中是否有任何插件可以自动生成代码?

提前致谢

【问题讨论】:

    标签: oop matlab uml code-generation


    【解决方案1】:

    您可以查看Object-Oriented Programming in MATLAB 并在文档中参考Object-Oriented Programming

    我建议仔细看看Value or Handle Class — Which to Use 。简而言之,句柄类允许您传递引用,而值类始终是原始对象的副本。

    我会惊讶地发现 ArgoUml 的插件,因为 MATLAB 主要由工程师使用,而不是软件开发人员。

    【讨论】:

    • 但我找不到如何实现关联。如果可能的话,我正在寻找一个例子。你知道我可以带一个吗?
    【解决方案2】:

    这是一个类关联的简单示例。该场景包含一门可以招收许多学生的课程:

    学生.m

    classdef Student < handle
        properties
            name
        end
        methods
            function obj = Student(name)
                if nargin > 0
                    obj.name = name;
                end
            end
            function delete(obj)
                fprintf('-- Student Destructor: %s\n',obj.name);
            end
        end
    end
    

    课程.m

    classdef Course < handle
        properties
            name        %# course name
            std         %# cell array of students
        end
        properties(Access = private)
            lastIdx = 1;
        end
        methods
            function obj = Course(name, capacity)
                obj.name = name;
                obj.std = cell(capacity,1);
            end
            function addStudent(obj, std)
                if obj.lastIdx > numel(obj.std)
                    fprintf(2, 'Sorry, class is full\n');
                    return
                end
                obj.std{obj.lastIdx} = std;
                obj.lastIdx = obj.lastIdx + 1;
            end
            function printClassRoster(obj)
                fprintf('Course Name = %s\n', obj.name);
                fprintf('Enrolled = %d, Capacity = %d\n', ...
                    obj.lastIdx-1, length(obj.std));
                for i=1:obj.lastIdx-1
                    fprintf('ID = %d, Name = %s\n', i, obj.std{i}.name);
                end
            end
        end
    
    end
    

    这是测试上述类的代码:

    c = Course('CS101', 3);
    for i=1:4
        name = sprintf('amro%d',i);
        fprintf('Adding student: %s\n', name)
        c.addStudent( Student(name) )
    end
    
    fprintf('\nClass Roster:\n=============\n')
    c.printClassRoster()
    
    fprintf('\nCleaning up:\n')
    clear c
    

    输出:

    Adding student: amro1
    Adding student: amro2
    Adding student: amro3
    Adding student: amro4
    Sorry, class is full
    -- Student Destructor: amro4
    
    Class Roster:
    =============
    Course Name = CS101
    Enrolled = 3, Capacity = 3
    ID = 1, Name = amro1
    ID = 2, Name = amro2
    ID = 3, Name = amro3
    
    Cleaning up:
    -- Student Destructor: amro1
    -- Student Destructor: amro2
    -- Student Destructor: amro3
    

    【讨论】:

    • 完美!!但我无法理解“销毁”过程......如果删除课程c,为什么所有学生都被删除?这样我们就有了一个组合……如何实现一个聚合?
    • @fdaniii:对不起,我的 OOP 概念有点生疏,但我在考虑一般意义上的关联。无论如何,MATLAB 使用引用计数,即如果对基础数据的另一个引用仍然存在,则内存不会被释放。因此,如果您不希望学生对象的生命周期依赖于课程对象,您可以将创建的对象存储在主函数中,然后将句柄传递给addStudent 方法:s = cell(4,1); for i=1:4, s{i} = Student('...'); c.addStudent(s{i}); end。这样,当课程对象被破坏时,它们仍然存在。
    • 您可以使用@ 符号来定义属性的类型,在此示例中为std@Student。与Class Student 的关联在没有它的情况下有效,但在@ 的情况下,它会被强制执行并记录在代码中。请参阅 Amros post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多