LANGUAGE:
我在MATLAB中编写面向对象的代码。我几乎写了所有这些内容,现在在尝试测试它时,我遇到了一个非常基本的问题。
代码背景:
我有一个类Window和一个类跟踪器。两者都是Singleton类的子类(也就是说,它们具有私有构造函数,以确保只创建一个类Window和类Tracker的单个实例)。
我实例化每一个 - 所以我现在有一个myWindow和myTracker对象。
在我的主脚本中,我调用了一个方法myWindow.isNewbead()。 isNewbead是类Window的公共方法。
那是场景。现在问题是:
问题:
在isNewbead()中,我调用myTracker.getpredictedPositions()。 getpredictedPositions()是Tracker类的公共方法。但是,当我运行这一行时,我得到一个错误,说变量'myTracker'未定义。当然,我查看变量工作空间,唯一的变量是局部变量INSIDE myWindow.isNewbead();
所以我现在有两个问题:
问题:
OOP到处都是这样吗?也就是说,你不能从另一个对象的方法内部调用对象的公共方法而不显式地将第一个对象传递给第二个对象的方法吗?这对我来说似乎很麻烦,因为我在每个方法中都使用了不同类的大量对象的属性和方法,所以每次都要传递数百个对象!
如果这只是一个特定于MATLAB的问题(比如无静态变量的问题),那么我该如何解决这个问题?
非常感谢你!
问候。
答案 0 :(得分:3)
对于Singleton,该模式需要“一种机制来访问单例类成员而不创建类对象”。如果你正在传递课程的实例,你做错了。这是一个使用静态类和全局appdata空间的Matlab实现。有another implementation的File Exchange来自{{3}},但它会被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
答案 1 :(得分:0)
是的,你可以从另一个对象(对象B)的方法调用一个对象(对象A)的公共方法,因为它是公共的;但是,您需要在对象B方法中使用对象A的引用。将对象A的引用作为对象B方法的输入参数传递。
看起来好像很麻烦,但这怎么可能呢?尽管Tracker继承自Singleton类,但myTracker仍然只是Tracker对象的实例。您需要对此实例的引用才能使用其方法。