Nice用戶手冊(三)
2024-07-21 02:14:14
供稿:網友
第三章 類與接口類聲明
數據成員
一個類最主要的組件使它的數據成員列表。數據成員是附屬于每一個類實例的變量,它有類型、名稱,可以有初始值。數據成員的聲明語法如下:
type field-name[ = initial-value];
如果沒有被賦予默認值,那么每一次調用構造器都必須給這個成員賦予一個指定的值。如果它擁有了默認值,對構造器的調用會覆蓋那個值,在這種情況下默認值不會被計算(只有當計算會帶來副作用時這一點會變得很重要)。
構造器
nice中的類有一個由編譯器自動生成的默認的(或者說“自動的”)構造器。這個構造器允許類中所有的事件成員被顯式地初始化,但如果一個數據成員在聲明時已經有了一個默認值時,它將不會出現在構造器中而是使用默認值。在大多數情況下,這個默認構造器已經可以滿足需要,它把程序員從煩悶的,僅僅是接收值并將它們賦給數據成員的代碼中解脫出來。
示例3.1 使用默認構造器聲明及創建類
class car{
string brand;
string model;
int numberofwheels = 4;
int numberofdrivingwheels = 2;
}
void test(){
car renault5 = new car(brand: "renault", model: "cinq");
car jeep = new car(brand: "jeep", model: "some jeep", numberofdrivingwheels: 4);
}
調用構造器時必須包含數據成員的名稱,這一點很重要。首先,這樣不用查看類定義就能很容易理解參數代表著什么。其次,可以不用再將數據成員武斷地列序1。(1在java中當構造器參數的次序必須被改變時會出現問題。這樣做必須修改所有的調用點,而這種修改在最好情況下會導致繁瑣的工作和錯誤,而在最壞情況下是不可能實現的(當編寫一個庫時)。當順序改變了而只有一部分調用點被修改后會出現以下情況:如果交換的參數類型不一致,編譯無法通過;或者,編譯可以通過但在運行時產生錯誤的結果。在java中沒有一個簡單的方法能解決這個問題。在nice中,調用構造器時使用名稱則是一種解決方案。)因為數據成員的名稱被顯式使用,賦值時可以使用任何順序。
當構造器中需要處理更多的控制時,可以寫一個新的構造器以取代自動構造器。新構造器的寫法很像其它方法,但在聲明時有細微差別:
new class-name(param-typeparam-name[ = initial-value], ...){
method-body;
this(argument, ...);
}
語法中要求任何自定義構造器中最后一條語句必須調用同一類型的其它構造器,在大多數情況下調用的是自動構造器。
示例3.2 使用自定義構造器定義并創建構類
/**
* class which encapsulates a strategy for
* way of translating a character.
*/
class translator{
//the function that actually performs the translation
char->char transfunction;
//convenience method
char translate(char input){
return (this.transfunction)(input);
}
}
/**
* constructor which takes a map of characters, and
* returns a translator which looks up the input
* character in the map, or just returns the input
* character if it's not in the map.
*/
new translator(map<char,char> characters){
this(transfunction: char c => characters.get(c) || c);
}
//a translator which provides rot13 ciphering.
//uses automatic constructor.
var translator rot13 = new translator(transfunction:char c => char(int(c) + 13));
//a translator which just changes 's' or 's' to '$'.
//uses custom constructor.
var translator stodollar = new translator(characters: listtomap([('s', '$'),('s', '$')]));