MATLAB ООП: Как мне вызвать метод объекта класса A изнутри метода в объекте класса B? - PullRequest
4 голосов
/ 19 января 2012

ЯЗЫК:

Я пишу объектно-ориентированный код в MATLAB. Я написал почти все это, и теперь, когда пытаюсь проверить это, я сталкиваюсь с тем, что выглядит как очень фундаментальная проблема.

ФОН КОДА:

У меня есть класс Window и класс Tracker. Оба являются подклассами класса Singleton (то есть они имеют частные конструкторы, чтобы обеспечить создание только одного экземпляра класса Window и класса Tracker).

Я создаю экземпляр каждого из них, поэтому теперь у меня есть объекты myWindow и myTracker.

В моем основном скрипте я вызываю метод myWindow.isNewbead (). isNewbead - это открытый метод класса Window.

Это сцена. Теперь проблема:

ПРОБЛЕМА:

Внутри isNewbead () я вызываю myTracker.getpredictedPositions (). getpredictedPositions () - это открытый метод класса Tracker. Однако, когда я запускаю эту строку, я получаю сообщение о том, что переменная 'myTracker' не определена. И, конечно же, я смотрю в рабочую область переменных, и единственными переменными являются локальные переменные INSIDE myWindow.isNewbead ();

Итак, теперь у меня есть два вопроса:

Вопросы:

  1. Это правда о ООП везде? То есть нельзя ли вызывать открытый метод для объекта изнутри метода другого объекта без явной передачи первого объекта методу второго объекта? Мне кажется, это очень хлопотно, потому что я использую свойства и методы множества объектов разных классов в каждом методе, поэтому мне придется каждый раз пропускать сотни объектов!

  2. Если это только проблема, относящаяся к MATLAB (например, проблема отсутствия статических переменных), то как мне обойти это?

Большое спасибо!

Привет.

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Для Singleton шаблон требует «механизма доступа к элементу класса singleton без создания объекта класса». Если вы передаете экземпляр класса, вы сделали это неправильно. Вот реализация Matlab, использующая статические классы и глобальное пространство appdata. Существует другая реализация , в которой есть абстрактный родительский элемент из 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
0 голосов
/ 19 января 2012

Да, вы можете вызывать открытый метод одного объекта (объекта A) из метода другого объекта (объекта B), так как он, в общем, публичный;однако вам необходимо иметь ссылку на объект A для использования в методе объекта B.Передайте ссылку на объект A в качестве входного аргумента в метод объекта B.

Это может показаться хлопотным, но как еще это может работать?Несмотря на то, что Tracker наследуется от класса Singleton, myTracker по-прежнему является просто экземпляром объекта Tracker.Вам нужна ссылка на этот экземпляр, чтобы использовать его методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...