Sun Java Solaris Communities My SDN Account Join SDN
 
Изучаем язык программирования JavaFX Script

Урок 9: Создание классов

Documentation Distribution Policy  
« Предыдущий 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Следующий »
 
Почти в каждом приложении на языке JavaFX Script вы захотите написать один или несколько классов. В некоторых случаях вы напишете класс с нуля, в других вам захочется расширить поведение другого класса. В начале урока приводится полный текст скрипта для класса Customer, который вы уже видели раньше. Также представлен абстрактный класс Account. Затем вы узнаете, как на базе этого абстрактного класса создать классы-наследники SavingsAccount и CheckingAccount.
 
Содержание
 
Пример Customer
Наследование от других классов
 
Пример Customer

Из урока Создание скрипта вы узнали как использовать объекты. Напомним, что мы попросили вас загрузить некоторое количество .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.

 
« Предыдущий 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Следующий »
 

Оглавление