主要内容

开发共同努力的课程

制定一个类

这个例子讨论了如何设计和实现两个通过事件和侦听器交互的类。这两个类代表一个银行账户和一个账户经理。

要设计一个表示银行帐户的类,首先要确定构成银行帐户抽象的数据元素和操作。例如,一个银行账户有:

  • 一个帐号

  • 账户余额

  • 状态(打开,关闭等)

您必须对银行帐户执行以下操作:

  • 为每个银行帐户创建一个对象

  • 存钱

  • 取钱

  • 生成一个声明

  • 保存并加载BankAccount对象

如果余额过低,而你试图取钱,银行账户就会发出通知。当此事件发生时,银行帐户向其他旨在侦听这些通知的实体广播通知。在本例中,一个简化版本的帐户管理程序执行此任务。

在此示例中,帐户管理器程序确定所有银行帐户的状态。该程序监视帐户余额并分配三个值之一:

  • 开放- 帐户余额是一个正价值

  • 透支-账户余额透支,但少于200美元。

  • 关闭- 账户余额超过200美元。

这些功能定义了所需的要求BankAccountAccountManager类。只包括满足特定目标所需的功能。金宝app通过子类化支持特殊类型的帐户BankAccount并向子类中添加更具体的特性。扩展AccountManager根据需要支持新帐户类型。金宝app

指定类组件

类将数据存储在属性中,使用方法实现操作,并使用事件和侦听器支持通知。金宝app以下是BankAccountAccountManager类定义这些组件。

类数据

该类定义了以下属性来存储账号、账户余额和账户状态:

  • AccountNumber—用于存储标识特定帐户的数字的属性。MATLAB®在创建类的实例时,将值赋给此属性。只有BankAccount类方法可以设置此属性。的SetAccess属性是私人

  • 账户余额-存储账户当前余额的属性。存款和取款的分类操作给这个财产赋予了价值。只有BankAccount类方法可以设置此属性。的SetAccess属性是私人

  • 帐户状态- - -BankAccount类定义此属性的默认值。的AccountManager类方法每当值的值时会更改此值账户余额低于0.的访问属性指定只有AccountManagerBankAccount类可以访问此属性。

  • AccountListener- 存储陷入困境事件监听器。保存一个BankAccount对象不保存此属性,因为在加载对象时必须重新创建侦听器。

班级操作

这些方法实现了类公式中定义的操作:

  • BankAccount- 接受帐号和初始余额以创建代表帐户的对象。

  • 存款- - -更新账户余额财产,当存款交易发生

  • 撤回- - -更新账户余额属性,当提现交易发生时

  • getStatement—显示帐户信息

  • loadobj—从mat文件加载对象时重新创建帐户管理器监听器。

类事件

帐户经理程序改变有负余额的银行帐户的状态。要实现此操作,请使用BankAccount类在提现导致负余额时触发事件。因此,触发InsufficientsFunds事件从内部发生撤回方法。

要定义事件,请在事件块。的调用来触发事件通知处理类方法。因为InsufficientsFunds不是预定义的事件,您可以将其命名为任何char用任何动作引导并触发它。

BankAccount类的实现

重要的是要确保只有一组与任何对象相关的数据BankAccount类。您不会想要对象的独立副本,例如,可能有不同的帐户余额值。因此,实现BankAccount类作为句柄类。给定句柄对象的所有副本都引用相同的数据。

BankAccount课程简介

BankAccount类 讨论
classdefBankAccount <处理

类的任何实例应该只有一个副本BankAccount句柄类和值类的比较

属性(Access = ?AccountManager) AccountStatus ='打开'结束

帐户状态包含由当前余额决定的帐户状态。访问仅限于BankAccountAccountManager类。班级成员访问

属性AccountNumber AccountBalance . (SetAccess = private结束属性(瞬态)AccountListener结束

帐户状态属性访问AccountManager类方法。

AccountNumber账户余额属性具有私有集访问。

AccountListener财产暂时暂时,因此不会保存侦听器句柄。

看到指定属性的属性

事件不充足的资金结束

类定义被调用的事件陷入困境撤回方法在帐户余额变为负数时触发事件。

有关活动和听众的信息,请参阅事件

方法

普通方法块。看到定义类方法和函数的语法。

函数Ba = BankAccount(AccountNumber,InitialBalance)Ba.accountNumber = AppuxNumber;ba.accountbalance = initialbalance;ba.accountListener = accommanager.addaccount(ba);结束

构造函数使用输入参数初始化属性值。

AccountManager.addAccount是静态方法AccountManager类。创建侦听器不充足的资金事件和存储侦听器句柄AccountListener财产。

函数存款(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(年代);结束结束

loadobj方法:

  • 如果加载操作失败,则从结构体

  • 使用新创建的侦听器重新创建侦听器BankAccount对象作为源。

有关保存和加载对象的更多信息,请参见对象的保存和加载过程

结束结束

End of static methods阻塞

结束classdef

展开类代码

制定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 ='透支'结束结束结束

assignStatus方法的回调陷入困境事件监听器。它决定了a的值BankAccount对象帐户状态属性的值账户余额财产。

BankAccount类构造函数调用AccountManageraddAccount创建和存储此侦听器的方法。

函数lh = addlistener(BA,“InsufficientFunds”...~ @ (src) AccountManager.assignStatus (src));结束

addAccount为此创建听众陷入困境事件,BankAccount类定义。

看到控制侦听器生命周期

结束结束

结束语句方法而对于classdef

展开类代码

使用BankAccount对象

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账户状态:开放-----------------------