#smalltalk #gnu-smalltalk
#java #наследование #параметры #абстрактный класс #smalltalk
Вопрос:
Допустим, я пытаюсь перевести приведенные ниже классы 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)
]
]
Несколько вопросов:
- Как я могу сделать Account абстрактным классом в Smalltalk?
- Правильно ли я предполагаю, что все переменные экземпляра учетной записи доступны только по имени в классе SavingsAccount?
- Как я могу реализовать что-то, что имитирует многопараметрический конструктор в классе Java SavingsAccount?
Ответ №1:
-
Вы не должны беспокоиться о каком-то «создании абстрактного класса» :). Но самое близкое решение вашего вопроса
abstractMethod [ self subclassResponsibility ]
Теперь, когда кто-то отправляет сообщение вашему классу, он получит сообщение об ошибке, что этот метод должен быть реализован, и вы должны переопределить его в подклассах.
-
ДА. Все переменные экземпляра могут быть доступны подклассу.
-
Итак, ключевое слово messages like
withdraw: amount
на самом деле может иметь несколько параметров, таких как:withdraw: amount becauseOf: reason
. Итак, прежде всего, вы создаете инициализатор:initWithBalance: aBalance customer: aCustomer number: aNumber [ self init. balance := aBalance. customer := aCustomer. number := aNumber ]
Вы можете сохранить
interest := 0.
в maininit
.
Затем, чтобы улучшить вашу жизнь, вы создаете параметризованныйnew
и вызываете параметризованныйinit
оттуда.SavingsAccount class [ newWithBalance: aBalance customer: aCustomer number: aNumber [ ^ self new initWithBalance: aBalance customer: aCustomer number: aNumber ] ]
Комментарии:
1. Это «ответственность за подклассы», а не «должна быть реализована». В противном случае, идеальный ответ. 🙂