第 9 課:編寫您自己的類

 
第 9 課:編寫您自己的類
在幾乎每個 JavaFX Script 應用程序中,您都需要編寫一個或多個類。在某些情況下,您需要從頭編寫類;在其他情況下,您需要擴展現有類的行爲。本課首先展示您以前看到過的 Customer 類的完整腳本。此外提供了一個抽象類 Account。隨後,您將會看到如何擴展該類以創建 SavingsAccountCheckingAccount 類。
 
目錄
 
Customer 示例
從其他類繼承
 

編寫腳本中,您學習瞭如何使用對象。但是,請回想一下,我們首先要求您下載多個 .class 文件,這樣編譯器將知道如何創建 AddressCustomer 對象。以下示例重新訪問這些代碼,此外添加了缺少的類定義以便對所有的內容進行編譯。

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 類聲明瞭 streetcitystatezip 實例變量,這些變量均爲 String 類型;Customer 類也聲明瞭幾個實例變量以及用來輸出這些變量的值的函數。由於這些變量和函數是在類中聲明的,因此您創建的任何 AddressCustomer 對象都可以使用它們。

您還可以編寫從其他類繼承變量和函數的類。例如,設想您在銀行有一個儲蓄賬戶和一個支票賬戶。每個賬戶都有賬號和餘額。您可以查詢餘額、存款或取款。我們可以通過創建一個用來提供最常用的變量和函數的 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 對象(此設計的目的在於使您只能創建儲蓄賬戶或支票賬戶)。

accountNumbalance 變量用來存放賬號和當前餘額。其餘函數提供基本行爲:獲得餘額、存款或取款。

然後,我們可以定義一個使用 extends 關鍵字來繼承這些變量和函數的 SavingsAccount 類:

class SavingsAccount extends Account {

var minBalance = 100.00;
var penalty = 5.00;

function checkMinBalance() : Void {
if(balance < minBalance){
balance -= penalty;
}
}
}
 

由於 SavingsAccountAccount 的子類,因此它將自動包含 Account 的所有實例變量和函數。這樣就可以使 SavingsAccount 源代碼將重點放在它與其父類之間的區別(要求儲蓄賬戶所有者必須至少保持 100 美元的餘額才能避免受罰)上。

類似地,我們可以定義一個也對 Account 進行擴展的 CheckingAccount 類:

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 關鍵字指示)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章