GNU Smalltalk - 继承和多参数方法/构造函数

2023-11-22

假设我正在尝试将以下 Java 类转换为 GNU Smalltalk:

public abstract class Account {

    protected String number;
    protected Customer customer;
    protected double balance;

    public abstract void accrue(double rate);

    public double balance() {
        return balance;
    }

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        balance -= amount;
    }

    public String toString() {
        return number + ":" + customer + ":" + balance;
    }
}

public class SavingsAccount extends Account {

    private double interest = 0;

    public SavingsAccount(String number, Customer customer, double balance) {
        this.number = number;
        this.customer = customer;
        this.balance = balance;
    }

    public void accrue(double rate) {
        balance += balance * rate;
        interest += interest * rate;
    }

}

我正在努力理解如何编写带有多个参数的方法/构造函数。这是我到目前为止所得到的:

Object subclass: Account [

    |number customer balance|

    balance [
        ^balance
    ]

    deposit: amount [
         balance := balance + amount
    ]

    withdraw: amount [
        balance := balance - amount
    ]

    asString [
        ^number asString, ':', customer asString, ':', balance asString
    ]

]

Account subclass: SavingsAccount [

    |interest|

    SavingsAccount class [
        new [ "add some sort of support for multiple arguments?"
           "call init"
        ]
    ]

    init [ "add some sort of support for multiple arguments?"
         interest := 0.
         balance := accountBalance.
         customer := accountCustomer.
         number := accountNumber
    ]

    accrue: rate [
        balance := balance + (balance * rate).
        interest := interest + (interest * rate)
    ]

]

几个问题:

  1. 如何使 Account 成为 Smalltalk 中的抽象类?
  2. 我假设所有 Account 实例变量只能通过 SavingsAccount 类中的名称访问是否正确?
  3. 如何实现模仿 Java SavingsAccount 类中的多参数构造函数的东西?

  1. 您不应该为某种“使类抽象”而烦恼:)。但最接近你的问题的解决方案是

    abstractMethod [
        self subclassResponsibility
    ]
    

    现在,当有人向您的类发送消息时,他会收到一条错误消息,指出应该实现此方法,并且您必须在子类中重写它。

  2. 是的。所有实例变量都可以由子类访问。

  3. 好的,所以关键字消息就像withdraw: amount实际上可以有多个参数,例如:withdraw: amount becauseOf: reason。所以首先你要创建一个初始化程序:

    initWithBalance: aBalance customer: aCustomer number: aNumber [ 
        self init.
        balance := aBalance.
        customer := aCustomer.
        number := aNumber
    ]
    

    你可以保留interest := 0.在主要init。 然后,为了让你的生活更美好,你做了一个参数化的new并调用参数化init从那里。

    SavingsAccount class [
        newWithBalance: aBalance customer: aCustomer number: aNumber [
           ^ self new initWithBalance: aBalance customer: aCustomer number: aNumber
        ]
    ]
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU Smalltalk - 继承和多参数方法/构造函数 的相关文章

随机推荐

  • 在 IIS 中编辑配置自定义部分

    我正在开发一个大型 ASP NET 项目 我们使用 ASP NET 3 5 该项目由 5 个不同的网站和一些共享程序集组成 最近我将自定义部分添加到web config每个站点的文件 当我部署所有这些应用程序时 每个站点都单独部署在同一应用
  • Magento:Mage::registry('current_product') 高效吗?

    如果您知道其背后的过程 这可能是显而易见的事情 但是当您使用Mage registry current product 例如 在产品页面上 您只是引用已经 加载 的内容还是每次运行该行代码时都会加载它 换句话说 哪个更有效率 下面是伪代码
  • 警告 MSB3283:找不到类型库“MSComctlLib”的包装器程序集。构建我的应用程序时

    我有一个已经存在多年的 Visual Studio 解决方案 该项目是一个 Visual Studio 2010 项目 多年来我一直能够编译和运行该项目 该应用程序是一个关键应用程序 我很少需要启动该项目并对已发现的错误修复进行较小的更改
  • %(百分号)在 crontab 中有何特殊之处?

    在crontab中 你能做这样的事情吗 echo date F gt gt path date txt 您的 crontab 行的实际问题不是 或反引号 问题是百分号 它在 crontab 中有特殊的含义 从联机帮助页 Percent si
  • matlab Quickie:测试文本文件是否为空

    简单的问题 我正在 matlab 7 x 中打开一个文件 我想在读取它之前测试它是否为空 最好的方法是什么 从中汲取一些知识上一个问题 我会执行以下操作 s dir c somefile txt if s bytes 0 empty fil
  • 如何在 MSBuild 中压缩文件夹?

    如何在 MSBuild 中压缩输出文件夹 对于文件名 我需要使用在其他地方设置的变量 MSBuild Community Tasks Zip 是一种方法 未定义WorkingCheckout 和OutputDirectory 但你可以得到下
  • 初始化数据的正确方法[重复]

    这个问题在这里已经有答案了 使用 RefluxJS 初始化数据 异步 的正确方法是什么 是否有类似于 AngularJS 的解析 或者 Flux 实现与此无关 路由器应该处理此责任 在应用程序的顶级组件中 使用comoponentWillM
  • 用于具有混合数据类型的列表的 Numpy dtype

    我有一个清单 my list 我想将混合数据类型转换为 numpy 数组 但是 我收到错误TypeError expected a readable buffer object 请参阅下面的代码 我试图将我的代码基于NumPy 文档 my
  • 如何更新xml java中的节点值

    我目前正在开发一个 xml 项目 到目前为止 我已经使用 Dom Parser 成功地将我的 xml 链接到我的 java 类 我有下面提供的代码 我正在努力解决的问题是将我的开始日期的月份更新为 1 因此像 2 1 2013 3 1 20
  • 如何隐藏 DIV,它们在页面加载时瞬间显示

    我制作了一个非常快速的 jQuery 幻灯片 我用它来隐藏在轮到它们之前不应该显示的 DIV document ready function Hide All Div s Apart From First div gall2 hide di
  • ISO C++ 标准 - 有关检查依赖基数的规则。为什么?

    最近我偶然发现了 VS 2017 中的 Visual C 编译器一致性模式切换 我读了这个解释下面介绍了开关如何禁止编译不合格的代码 template
  • 检查 JavaScript 或 Angular 中的 Array 对象中是否存在值

    我想检查数组对象中是否存在值 例子 我有这个数组 id 1 name foo id 2 name bar id 3 name test 我想检查是否id 2存在于此处 您可以使用数组 prototype some var a id 1 na
  • 为什么隐式生成的构造函数(等)比用户定义的(简单的)构造函数更有效?

    我读了这个article今天早上 D Kalev 介绍了 c 11 新功能 默认和删除的函数 并且无法理解有关性能的部分 即 手动定义特殊成员函数 即使它很简单 通常比隐式定义的函数效率低 通过谷歌寻找答案 我找到了另一个article同一
  • DELETE + JOIN + ORDER BY + LIMIT = 语法错误

    放下ORDER BY LIMIT or the JOIN 一切都是桃子 把它们放在一起 我似乎释放了海妖 谁能透露一些信息 DELETE table1 AS t1 FROM table1 AS t1 LEFT JOIN table2 AS
  • 使用 python zipfile 归档符号链接

    我有一个脚本可以创建包含符号链接的目录的 zip 文件 我 惊讶地发现 zip 文件已经压缩了目标 链接而不是链接本身 这就是我想要的并且 预期的 有人知道如何获取 zipfile 来压缩链接吗 zip 文件可以存储符号链接 而不是文件本身
  • SmtpClient 超时不起作用

    我已经设置了SmtpClient类的Timeout属性 但它似乎不起作用 当我给它一个1毫秒的值时 执行代码时超时实际上是15秒 我从中获取的代码msdn string to email protected string from emai
  • 如何从 PHP 数组中删除重复值

    如何从 PHP 数组中删除重复值 Use array unique 对于一维数组 来自 PHP 手册 获取一个输入数组并返回一个没有重复值的新数组 请注意 密钥会被保留 如果多个元素在给定标志下比较相等 则将保留第一个相等元素的键和值 注意
  • MVP模式,一个主持人有多少浏览量?

    我们正在尝试将模型 视图 呈现器模式用于 几乎 我们承担的所有新开发工作 我坚信有一个框架可以帮助人们满足设计要求 我们有一些用于各种不同组件 日志记录 电子邮件发送等 的内部框架 所以我正在尝试获得某种 MVP框架已开发 我已经成功地整合
  • Android:如何以字节为单位读取文件?

    我正在尝试在 Android 应用程序中获取以字节为单位的文件内容 我已获取 SD 卡中的文件 现在想要获取所选文件 以字节为单位 我用谷歌搜索但没有这样的成功 请帮忙 下面是获取带有扩展名的文件的代码 通过这个我获取文件并在微调器中显示
  • GNU Smalltalk - 继承和多参数方法/构造函数

    假设我正在尝试将以下 Java 类转换为 GNU Smalltalk public abstract class Account protected String number protected Customer customer pro