当前位置: 首页 > 面试题库 >

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

马梓
2023-03-14
问题内容

假设我正在尝试将以下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
    

    ]

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

  1. 是。子类可以访问所有实例变量。

  2. 好的,因此关键字消息之类的withdraw: amount实际上可以具有多个参数,例如:withdraw: amount becauseOf: reason。因此,首先要进行初始化:

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

    ]

您可以保持interest := 0.main init。然后,为了使您的生活更好,您可以进行参数设置newinit从那里html" target="_blank">调用参数设置。

    SavingsAccount class [
    newWithBalance: aBalance customer: aCustomer number: aNumber [
       ^ self new initWithBalance: aBalance customer: aCustomer number: aNumber
    ]
]


 类似资料:
  • 本文向大家介绍php构造函数的继承方法,包括了php构造函数的继承方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php构造函数的继承方法。分享给大家供大家参考。具体如下: 第一种情况:子类没有定义构造函数时,默认继承。例子: 输出结果:小强 第二种情况:子类定义了构造函数,则不会被继承。实例: 输出结果:BBBBBB子类 第三种情况:如果需要调用父类的构造函数,则可以使用:paren

  • 问题内容: 在为期末考试而学习时,我在正在学习的书中遇到了以下陈述。考虑以下代码: 是否必须在类B(super(x))的构造函数中调用类A的构造函数。本书指出这不是强制性的,因为它们具有确切数量和类型的参数。但是,当我在Java编译器中尝试此操作时,会抛出以下错误: 类A中的构造函数A不能应用于给定类型;必需:发现整数:无参数原因:实际和正式参数列表的长度不同 问题答案: 编译器会自动插入开头。

  • 问题内容: 我想知道为什么在Java中不继承构造函数?你知道当你上这样的课时: 稍后当你从继承时Super,java会抱怨没有定义默认的构造函数。解决方案显然是这样的: 这段代码是重复的,而不是干的和无用的(IMHO)…因此再次带来了问题: 为什么Java不支持构造函数继承?不允许这种继承有什么好处? 问题答案: 假设构造函数是继承的…则因为每个类最终都派生自Object,所以每个类最终都将带有无

  • 问题内容: 我想要一个构造函数,其参数会自动被所有子类继承,但是Java不允许我这样做 我不希望有写,等等。每个子类。有没有更聪明的方法来解决这个问题? 解决方案#1。构造一个可以在构造函数之后调用的方法。尽管对我的特定设计而言,这是可行的,但是我希望要求用户在构造函数中指定在编译时经过验证的某些参数(例如,不通过varargs / reflection)。 问题答案: 你不能 如果要在基类中有一

  • 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // OK // 调用的到底是B::f(doube)还是D::f(int)呢? // 实际情况往往会让人感到意外

  • 本文向大家介绍JS继承之借用构造函数继承和组合继承,包括了JS继承之借用构造函数继承和组合继承的使用技巧和注意事项,需要的朋友参考一下 借用构造函数继承  在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数。