Почти в каждом приложении на языке JavaFX Script вы захотите написать один или несколько классов. В некоторых случаях вы напишете класс с нуля, в других вам захочется расширить поведение другого класса.
В начале урока приводится полный текст скрипта для класса Customer, который вы уже видели раньше.
Также представлен абстрактный класс Account .
Затем вы узнаете, как на базе этого абстрактного класса создать классы-наследники
SavingsAccount и CheckingAccount . |
Содержание
Из урока Создание скрипта вы узнали как использовать объекты.
Напомним, что мы попросили вас загрузить некоторое количество
.class файлов, чтобы компилятор знал, как
создать объекты Address и Customer .
В следующем примере в этот код добавлены недостающие
определения классов, чтобы компиляция прошла без ошибок.
def customer = Customer {
firstName: "John";
lastName: "Doe";
phoneNum: "(408) 555-1212"
address: Address {
street: "1 Main Street";
city: "Santa Clara";
state: "CA";
zip: "95050";
}
}
customer.printName();
customer.printPhoneNum();
customer.printAddress();
class Address {
var street: String;
var city: String;
var state: String;
var zip: String;
}
class Customer {
var firstName: String;
var lastName: String;
var phoneNum: String;
var address: Address;
function printName() {
println("Name: {firstName} {lastName}");
}
function printPhoneNum(){
println("Phone: {phoneNum}");
}
function printAddress(){
println("Street: {address.street}");
println("City: {address.city}");
println("State: {address.state}");
println("Zip: {address.zip}");
}
}
|
На основе того, что вы уже знаете о переменных и функциях, этот пример должен выглядеть знакомым. Класс Address объявляет переменные экземпляра street , city , state , и zip как переменные типа String ; класс Customer также объявляет несколько переменных экземпляра, а также функции для вывода их значений. Поскольку эти переменные и функции объявлены внутри классов, они будут доступны любому созданному вами объекту Address или Customer .
Mожно создать классы, которые наследуют
переменные и функции других классов.
Например, представьте себе депозитный и текущий счет в банке.
У каждого счета есть номер и баланс.
Вы можете запрашивать баланс, пополнять счет или снимать деньги. Мы можем это смоделировать при помощи базового класса Account , который обеспечивает наиболее общие переменные и функции:
abstract class Account {
var accountNum: Integer;
var balance: Number;
function getBalance(): Number {
return balance;
}
function deposit(amount: Number): Void {
balance += amount;
}
function withdraw(amount: Number): Void {
balance -= amount;
}
}
|
Мы пометили этот класс как abstract , имея в виду, что объекты Account не могут быть созданы напрямую. Цель такого дизайна состоит в том, чтобы вы могли создавать только депозитные или только текущие счета.
Переменные accountNum и balance хранят номер счета и текущий баланс. Остальные функции обеспечивают основные операции: получение баланса, пополнение счета и снятие денег со счета.
Затем мы можем определить класс SavingsAccount , который использует зарезервированное слово extends для наследования этих переменных и функций:
class SavingsAccount extends Account {
var minBalance = 100.00;
var penalty = 5.00;
function checkMinBalance() : Void {
if(balance < minBalance){
balance -= penalty;
}
}
}
|
Поскольку SavingsAccount является подклассом класса Account , он автоматически содержит все переменные экземпляра и функции класса Account . Это позволяет сосредоточиться в исходном коде SavingsAccount
на том, чем этот класс отличается от родительского класса, а именно, реализовать требование о необходимости сохранять минимальный баланс $100, чтобы избежать штрафа.
Мы можем аналогично определить класс CheckingAccount , который также является наследником класса Account :
class CheckingAccount extends Account {
var hasOverDraftProtection: Boolean;
override function withdraw(amount: Number) : Void {
if(balance-amount<0 and hasOverDraftProtection){
// code to borrow money from an overdraft account would go here
} else {
balance -= amount; // may result in negative account balance!
}
}
}
|
Этот код отличается от кода Account тем, что в нем определена переменная, которая
следит за тем, имеет ли владелец счета превышение кредита или нет (например, если операция снятия со счета по выписанному чеку приведет к отрицательному балансу,
будет активировано превышение кредита, чтобы обеспечить принятие чека).
Обратите внимание, что в этом случае мы меняем поведение унаследованной функции
withdraw .
Этот прием известен как переопределение функции
и обозначается зарезервированным словом override .
|
|