未定义函数 'addListener'
Undefined function 'addListener'
我正在阅读 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) 上。我想我已经正确实施但没有复制粘贴,也许我忽略了一行。谢谢
那是因为你对 method 的拼写有点不对。它被称为 addlistener
- 小写 l
。当你拼写时,你有一个大写的 L。
您所引用的书是 MATLAB 的官方面向对象编程指南 - http://www.mathworks.com/help/pdf_doc/matlab/matlab_oop.pdf。有问题的代码在第 3-16 页。
请记住,MATLAB 区分大小写。即使字符是不同的大小写,它也会被解释为不同的变量、函数等。别担心 - 我认为 addListener
更自然,因为有两个词。 addlistener
只是……很奇怪!
我正在阅读 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) 上。我想我已经正确实施但没有复制粘贴,也许我忽略了一行。谢谢
那是因为你对 method 的拼写有点不对。它被称为 addlistener
- 小写 l
。当你拼写时,你有一个大写的 L。
您所引用的书是 MATLAB 的官方面向对象编程指南 - http://www.mathworks.com/help/pdf_doc/matlab/matlab_oop.pdf。有问题的代码在第 3-16 页。
请记住,MATLAB 区分大小写。即使字符是不同的大小写,它也会被解释为不同的变量、函数等。别担心 - 我认为 addListener
更自然,因为有两个词。 addlistener
只是……很奇怪!