未定义的函数'addListener'

时间:2015-03-11 18:29:26

标签: matlab class oop

我正在阅读Matlab OOP pdf的pdf书,在实施银行账户第3章的代码之后,它抱怨了什么。

>> BA = BankAccount(1234567, 500)
    Undefined function 'addListener' for input arguments of type 'BankAccount'.
Error in AccountManager.addAccount (line 20)
            lh = addListener(BA, 'InsufficientFunds', @(src,
            ~)AccountManager.assignStatus(src))
Error in BankAccount (line 21)
            BA.AccountListener = AccountManager.addAccount(BA); 

我不知道为什么这是我按照给出的例子,因为:

classdef BankAccount < handle
    %UNTITLED Summary of this class goes here
    %   Detailed explanation goes here
    properties (Access = ?AccountManager)
    AccountStatus = 'open'
    end
    properties (SetAccess='private')
        AccountNumber
        AccountBalance
    end
    properties (Transient) %not saved
        AccountListener
    end
    events
        InsufficientFunds
    end
    methods
        function BA = BankAccount(AccountNumber, InitialBalance)
            BA.AccountNumber = AccountNumber;
            BA.AccountBalance = InitialBalance;
            BA.AccountListener = AccountManager.addAccount(BA);
        end

        function deposit(BA, amt)
            BA.AccountBalance = BA.AccountBalance + amt
            if BA.AccountBalance > 0
                BA.AccountStatus = 'open'
            end
        end

        function withdraw(BA, amt)
            if (strcmp(BA.AccountStatus, 'closed') && BA.AccountBalance <= 0)
                disp(['Account', num2str(BA.AccountNumber), 'has been closed'])
                return
            end
            newBal = BA.AccountBalance - amt
            BA.AccountBalance = newBal
            if newBal < 0
                notify(BA, 'InsufficientFunds')
            end
        end

        function getStatement(BA)
            disp('-----------')
            disp(['Account', num2str(BA.AccountNumber)])
            ab = sprintf('%0.2f', BA.AccountBalance)
            disp(['Current Balance', ab])
            disp(['Account Status', BA.AccountStatus])
            disp('-----------')
        end

    end
    methods (Static)
        function obj = loadObj(s)
            if isstruct(s)
                accNum = s.AccountNumber
                initBal = s.AccountBalance
                obj = BankAccount(accNum, initBal)
            else
                obj.AccountListener = AccountManager.addAccount(s)
            end
        end

    end


end

classdef AccountManager
    %UNTITLED2 Summary of this class goes here
    %   Detailed explanation goes here

    properties
    end

    methods (Static)
        function assignStatus(BA)
            if BA.AccountBalance < 0
                if BA.AccountBalance < -200
                    BA.AccountStatus = 'closed'
                else
                    BA.AccountStatus = 'overdrawn'
                end
            end
        end

        function lh = addAccount(BA)
            lh = addListener(BA, 'InsufficientFunds', @(src, ~)AccountManager.assignStatus(src))
        end

    end

end

所以有人能告诉我这里发生了什么吗?在Matlab R2014a(8.3.0.532)上。我想我已经正确实施但没有复制粘贴,也许我忽略了一条线。感谢。

1 个答案:

答案 0 :(得分:3)

那是因为拼写方法的方式略有不正确。它被称为addlistener - 小写l 。拼写时你有一个大写字母L.

您正在引用的书是MATLAB的官方面向对象编程指南 - http://www.mathworks.com/help/pdf_doc/matlab/matlab_oop.pdf。有问题的代码在第3-16页。

请记住,MATLAB区分大小写。即使字符是不同的情况,它也会被解释为不同的变量,函数等。不要担心 - 我认为addListener更自然,因为有两个单词。 addlistener只是......很奇怪!