【问题标题】:MATLAB OOP : How do I call a method on an object of class A from inside a method in an object of class B?MATLAB OOP:如何从 B 类对象的方法内部调用 A 类对象的方法?
【发布时间】:2012-01-18 20:53:41
【问题描述】:

语言:

我正在 MATLAB 中编写面向对象的代码。我写了几乎所有内容,现在在尝试对其进行测试时,遇到了一个看起来非常基本的问题。

代码背景:

我有一个类 Window 和一个类 Tracker。两者都是 Singleton 类的子类(也就是说,它们具有私有构造函数以确保只创建一个 Window 类和 Tracker 类的单个实例)。

我实例化了它们中的每一个——所以我现在有一个 myWindow 和 myTracker 对象。

在我的主脚本中,我调用了一个方法 myWindow.isNewbead()。 isNewbead 是 Window 类的公共方法。

就是这样的场景。现在的问题:

问题:

在 isNewbead() 内部,我调用了 myTracker.getpredictedPositions()。 getpredictedPositions() 是类 Tracker 的公共方法。但是,当我运行此行时,我收到一条错误消息,指出变量“myTracker”未定义。果然,我查看了变量工作区,唯一的变量是局部变量 INSIDE myWindow.isNewbead();

所以我现在有两个问题:

问题:

  1. OOP 无处不在吗?也就是说,不显式地将第一个对象传递给第二个对象的方法,就不能从另一个对象的方法内部调用一个对象的公共方法吗?这对我来说似乎很麻烦,因为我在每个方法中都使用了许多不同类的对象的属性和方法,所以我每次都要传递数百个对象!

  2. 如果这只是一个特定于 MATLAB 的问题(如无静态变量的问题),那么我该如何解决呢?

非常感谢!

问候。

【问题讨论】:

    标签: oop matlab


    【解决方案1】:

    对于单例,该模式需要“一种无需创建类对象即可访问单例类成员的机制”。如果您正在传递类的实例,那么您做错了。这是一个使用静态类和全局 appdata 空间的 Matlab 实现。有一个another implementation,它确实有一个来自File Exchange 的抽象父级,但它会被clear classes 删除。选择你的毒药。

    classdef MySingleton < handle
    %
    %SingletonParent - A class to limit the instances created to one.
    %
    %There is a problem with matlab:
    %   clear classes will clear just about any instance, even those stored in
    %   persistent variables inside of functions.  This would close any opened singletons
    %   To work around this, we have a method that creates an instance and assigns
    %   it to the appdata structure.  This instance can be explicitly killed, but
    %   clear all and clear classes will not kill it.  If you ever clear classes,
    %   you will get several messages of this flavor:
    %
    %   Warning: Objects of 'MySingleton' class exist.  Cannot clear this
    %   class or any of its super-classes.
    %
    %   because of the way we assign and store the singleton, you cannot make
    % this an abstract parent
    %
    %   Also, any intialization must be done after you get the instance, since you
    %   have to be able to create it without any data.
    %
    
    properties  (Constant)
        APP_DATA_NAME = 'MySingleton';
    end %properties
    
    
    methods (Access = private)
        function obj = MySingleton()
            %initialization code.
            %must be private to ensure getInstance call is the only link into it.
        end %Singleton
    end%private methods
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    methods (Static)
        function out = getInstance()
    
        %getInstance - get/creates Singleton
        %
        %   stores the instnace such that it is immune to clear all/clear classes
        %
        %out = getInstance
        %Returns
        %   singleton instance.  if it does not exist, creates a default one, or passes the data to the ctor
    
        if ~isappdata(0, MySingleton.APP_DATA_NAME);
            obj = MySingleton;
            setappdata(0, MySingleton.APP_DATA_NAME, obj);
        end
    
        out = getappdata(0, MySingleton.APP_DATA_NAME);
    
        end %getMasterInstance()
    
    end %static methods
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    methods
        %public methods that it uses to work.
    end %PublicMethods
    
    
    
    end %MySingleton Class
    

    【讨论】:

      【解决方案2】:

      是的,您可以从另一个对象(对象 B)的方法调用一个对象(对象 A)的公共方法,因为它是公共的;但是,您需要引用对象 A 才能在对象 B 方法中使用。将对象 A 的引用作为输入参数传递给对象 B 方法。

      这可能看起来很麻烦,但是这还能怎么做呢?即使 Tracker 继承自 Singleton 类,myTracker 仍然只是 Tracker 对象的一个​​instance。您需要对该实例的引用才能使用其方法。

      【讨论】:

      • 嗨,b3,非常感谢您如此快速而清晰的回复!好的,我从中得到的事实是有静态方法,但没有“静态对象”。我们绝对需要传递对我们希望使用的对象的引用。但是好的程序是否将不同类的长列表作为参数传递给其他类中的方法?没有更清洁的方法吗?再次,非常感谢!
      • 如果您需要将一长串对象作为输入参数传递给方法,这可能表明您需要检查方法的模块化。也许将方法分成几个方法会更好。或者,由于您正在处理一个单例类,是否有可能拥有一个类的属性来存储对构造对象的引用,该对象将在构造函数中设置?这样一来,静态方法就可以使用该属性对此类的唯一实例进行操作。
      • 嗯,忽略我在上述评论中的第二个建议。它不起作用,因为它依赖于能够更新构造函数中的常量属性的值,这是不可能的。对不起。
      • 如果你传递一个单例的实例,它不是单例,它只是一个有一个实例的类。来自维基百科(我的 GOF 在 1500 英里之外,抱歉)“单例模式的实现必须满足单实例和全局访问原则。它需要一种机制来访问单例类成员而不创建类对象以及在类对象之间保持类成员值的机制。” (强调)
      • 更多关于 MATLAB 上下文中该主题的对话,请访问:mathworks.com/matlabcentral/newsreader/view_thread/170056
      猜你喜欢
      • 2013-06-12
      • 2021-12-07
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      相关资源
      最近更新 更多