这个例子讨论了如何设计和实现两个通过事件和侦听器交互的类。这两个类代表一个银行账户和一个账户经理。
要设计一个表示银行帐户的类,首先要确定构成银行帐户抽象的数据元素和操作。例如,一个银行账户有:
一个帐号
账户余额
状态(打开,关闭等)
您必须对银行帐户执行以下操作:
为每个银行帐户创建一个对象
存钱
取钱
生成一个声明
保存并加载BankAccount
对象
如果余额过低,而你试图取钱,银行账户就会发出通知。当此事件发生时,银行帐户向其他旨在侦听这些通知的实体广播通知。在本例中,一个简化版本的帐户管理程序执行此任务。
在此示例中,帐户管理器程序确定所有银行帐户的状态。该程序监视帐户余额并分配三个值之一:
开放
- 帐户余额是一个正价值
透支
-账户余额透支,但少于200美元。
关闭
- 账户余额超过200美元。
这些功能定义了所需的要求BankAccount
和AccountManager
类。只包括满足特定目标所需的功能。金宝app通过子类化支持特殊类型的帐户BankAccount
并向子类中添加更具体的特性。扩展AccountManager
根据需要支持新帐户类型。金宝app
类将数据存储在属性中,使用方法实现操作,并使用事件和侦听器支持通知。金宝app以下是BankAccount
和AccountManager
类定义这些组件。
该类定义了以下属性来存储账号、账户余额和账户状态:
AccountNumber
—用于存储标识特定帐户的数字的属性。MATLAB®在创建类的实例时,将值赋给此属性。只有BankAccount
类方法可以设置此属性。的SetAccess
属性是私人
.
账户余额
-存储账户当前余额的属性。存款和取款的分类操作给这个财产赋予了价值。只有BankAccount
类方法可以设置此属性。的SetAccess
属性是私人
.
帐户状态
- - -BankAccount
类定义此属性的默认值。的AccountManager
类方法每当值的值时会更改此值账户余额
低于0
.的访问
属性指定只有AccountManager
和BankAccount
类可以访问此属性。
AccountListener
- 存储陷入困境
事件监听器。保存一个BankAccount
对象不保存此属性,因为在加载对象时必须重新创建侦听器。
这些方法实现了类公式中定义的操作:
BankAccount
- 接受帐号和初始余额以创建代表帐户的对象。
存款
- - -更新账户余额
财产,当存款交易发生
撤回
- - -更新账户余额
属性,当提现交易发生时
getStatement
—显示帐户信息
loadobj
—从mat文件加载对象时重新创建帐户管理器监听器。
帐户经理程序改变有负余额的银行帐户的状态。要实现此操作,请使用BankAccount
类在提现导致负余额时触发事件。因此,触发InsufficientsFunds
事件从内部发生撤回
方法。
要定义事件,请在事件
块。的调用来触发事件通知
处理类方法。因为InsufficientsFunds
不是预定义的事件,您可以将其命名为任何char
用任何动作引导并触发它。
BankAccount
类的实现重要的是要确保只有一组与任何对象相关的数据BankAccount
类。您不会想要对象的独立副本,例如,可能有不同的帐户余额值。因此,实现BankAccount
类作为句柄类。给定句柄对象的所有副本都引用相同的数据。
BankAccount
课程简介BankAccount类 | 讨论 |
---|---|
classdefBankAccount <处理
|
类的任何实例应该只有一个副本 |
属性(Access = ?AccountManager) AccountStatus ='打开'结束 |
|
属性AccountNumber AccountBalance . (SetAccess = private结束属性(瞬态)AccountListener结束 |
看到指定属性的属性. |
事件不充足的资金结束 |
类定义被调用的事件 有关活动和听众的信息,请参阅事件. |
方法
|
普通方法块。看到定义类方法和函数的语法。 |
函数Ba = BankAccount(AccountNumber,InitialBalance)Ba.accountNumber = AppuxNumber;ba.accountbalance = initialbalance;ba.accountListener = accommanager.addaccount(ba);结束 |
构造函数使用输入参数初始化属性值。
|
函数存款(BA, amt)英航。账户余额= BA.AccountBalance + amt;如果英航。AccountBalance > 0 BA。AccountStatus ='打开';结束结束 |
如果 |
函数撤回(BA,AMT)如果(strcmp(ba.accountstatus,“关闭”) & &...英航。< 0)显示(['帐户 'num2str (BA.AccountNumber),...'已关闭。'])返回结束newbal =英航。帐户Balance - amt; BA.AccountBalance = newbal;如果newbal < 0 notify(BA,“InsufficientFunds”)结束结束 |
更新 有关侦听器的更多信息,请参见事件和监听器语法. |
函数getStatement (BA) disp ('-----------------------) disp ([的帐户:,num2str(ba.accountnumber)])ab = sprintf('%0.2f', BA.AccountBalance);disp ([“CurrentBalance:”, ab) disp ([的帐户状态:BA.AccountStatus]) disp ('-----------------------)结束 |
显示有关该帐户的所选信息。 |
结束方法(静止的) |
普通方法块的结束。 静态方法块的开头。看到静态方法 |
函数obj = loadobj(s)如果isstruct(s) accNum = s. accountnumber;initBal = s.AccountBalance;obj = BankAccount (accNum initBal);其他的obj。AccountListener = AccountManager.addAccount(年代);结束结束 |
有关保存和加载对象的更多信息,请参见对象的保存和加载过程 |
结束结束 |
End of static methods阻塞 结束 |
AccountManager
类该项目的目的AccountManager
类是为帐户提供服务。为BankAccount
班级,这AccountManager
类侦听导致余额降至负范围的提款。当BankAccount
对象触发InsufficientsFunds
活动,赛事AccountManager
重置帐户状态。
的AccountManager
类别不提供数据,因此它不需要属性。的BankAccount
对象存储侦听器对象的句柄。
的AccountManager
执行两个操作:
根据提款结果为每个账户指定一个状态
通过监控帐户余额向系统添加帐户。
的AccountManager
类实现两种方法:
assignStatus
- 将状态分配给a的方法BankAccount
对象。用作监听器回调。
addAccount
方法,该方法创建不充足的资金
侦听器。
AccountManager
类的AccountManager
类将这两个方法实现为静态的,因为不需要AccountManager
对象。这些方法的作用是BankAccount
对象。
的AccountManager
不打算被实例化。分离的功能AccountManager
类的BankAccount
类提供了更大的灵活性和可扩展性。例如,这样做可以:
扩展AccountManager
类来支持其他类型的金宝app帐户,同时保持个人帐户类简单和专业化。
更改帐户状态的条件而不影响保存和加载的兼容性BankAccount
对象。
开发一个帐户
派生出所有帐户的公共属性,而不需要每个子类实现帐户管理功能的超类
AccountManager
课程简介AccountManager类 | 讨论 |
---|---|
classdefAccountManager
|
这个类定义 |
方法(静止的)
|
不需要创建该类的实例,因此定义的方法是静态的。看到静态方法. |
函数AccientStatus(BA)如果英航。AccountBalance < 0如果英航。AccountBalance < - 200ba。AccountStatus =“关闭”;其他的ba.accountstatus ='透支';结束结束结束 |
的 的 |
函数lh = addlistener(BA,“InsufficientFunds”,...~ @ (src) AccountManager.assignStatus (src));结束 |
|
结束结束 |
|
的BankAccount
类,虽然过于简单,但演示了MATLAB类的行为。例如,创建一个BankAccount
对象有一个账号和500美元的初始存款:
Ba = BankAccount(1234567,500)
BA = BankAccount with properties: AccountNumber: 1234567 AccountBalance: 500 AccountListener: [1x1 event.listener]
使用getStatement
查看状态的方法:
getStatement (BA)
------------------------- 账户:1234567 CurrentBalance: 500.00帐户状态:开放 -------------------------
提取600美元,导致账户余额为负:
收回(BA, 600) getStatement (BA)
------------------------- 账户:1234567 CurrentBalance: -100.00帐户状态:透支 -------------------------
600美元的提款触发了InsufficientsFunds
事件。ConsockManager类定义的当前标准导致状态透支
.
再取200美元:
收回(BA, 200) getStatement (BA)
------------------------- 账户:1234567 CurrentBalance: -300.00帐户状态:关闭 -------------------------
现在,帐户状态
已被设定为关闭
通过侦听器并进一步尝试在不触发事件的情况下被阻止撤销:
撤回(BA,100)
帐户1234567已被关闭。
如果账户余额
由存款返回正值,则帐户状态
返回打开,并再次允许取款:
存款(BA,700)GetStatement(BA)
-------------------------账户:400.00账户状态:开放-----------------------