BOO入門/方法

維基教科書,自由的教學讀本

BOO入門 > 方法 (上一章:類別 下一章:多型與繼承)


定義 定義 方法:專屬於類別的函數。

定義方法[編輯]

方法必須定義在類別裏。定義的方法就與函數一樣。

// 方法的範例
class Cat:
    def Roar():
        pring "Meow!"
        #修正 上面這此行更正為 print "Meow!"

cat = Cat()
cat.Roar()

輸出結果

Meow!

首先得先把 Cat 實體化為物件,然後才能使用它的方法。

建議 建議 方法的名字應該都使用動詞,並以 PascalCase 命名。

類別建構子與解構子[編輯]

建構子與解構子是特別的方法,它們會在類別被實體化或被消滅時被呼叫。這兩者可有可無。

// 建構子與解構子範例
class Cat:
    def constructor():
        _name = 'Whiskers'

    def destructor():
        print "${_name} is no more... RIP"

    [Getter(Name)]
    _name as string

cat = Cat()
print cat.Name

輸出結果

Whiskers
Whiskers is no more... RIP

如果建構子有引數,那麼在實體化的時候,就要帶入引數。解構子不能有引數。

// 建構子有引數的範例
class Cat:
    def constructor(name as string):
        _name = name

    [Getter(Name)]
    _name as string

cat = Cat("Buttons")
print cat.Name

輸出結果

Buttons

小心!不要以為解構子一定都會被呼叫!!

譯註:因為所有變數的生命週期都是交由 .NET CLR 來管理,.NET CLR 本身的垃圾回收機制會在適當的時機進行回收、解構這些變數。所以解構子被呼叫的時機並不一定,也因此你不能假設解構子一定都會被執行,也許到程式整個結束才會呼叫也不一定。

方法修飾詞[編輯]

修飾詞 描述
abstract 抽象的方法,沒有實作,主要是讓子類別來實作。implements it.
static 靜態的方法,這意味着你不需要實體化就能呼叫此方法。
virtual 請參考下一章:多型與繼承
override 請參考下一章:多型與繼承

這些修飾詞也可以用在屬性上(在有明確定義時,請參考欄位與屬性裏"明確的屬性範例"),而 static 還可以用在欄位上。

// static 範例
class Animal:
    def constructor():
        _currentId += 1
        _id = currentId

    [Getter(Id)]
    _id as int

    static _currentId = 0

上面的例子在 Animal 類別被實體化時,會給予每個實體一個唯一的 Id。

所有定義在介面裏的方法會自動被宣告為 abstract。類別裏的方法若被加上 abstract 修飾詞,那麼裏面不能有任何代碼,必須是空的 (加上 pass)。

// abstract 範例
class Feline:
    abstract def Eat():
        pass

interface IFeline:
    def Eat()

上面的例子裏,Feline 與 IFeline 的 Eat 都是 abstract。

成員可視性[編輯]

可視層級 描述
public 成員能被其他型別完整存取。
protected 只有類別裏或是其衍生類別裏才能看到、存取。
private 只能在宣告的類別裏看到、存取。

重要的訊息 所有的欄位預設都是 protected,所有的方法、屬性和事件預設都是 public。

建議 建議 欄位一般都是 protected 或 private。若要讓欄位變為 public,通常不直接加上 public,而是以 public 屬性包裹起來。這允許子類別可以覆寫其行為。方法則沒有特別的慣例,視你自己需求加上 protected、private、public。屬性也是都能加上,通常屬性有 getter 和 setter,或是單獨一個 getter。如果只有 setter 時,考慮使用方法來取代(例如:"SetSomeValue( val as int)")。
建議 建議 建議你在 private 欄位名稱的前面加上底線 '_'。

在建構子裏宣告屬性[編輯]

Boo 提供了一個非常有用的特性,它讓你可以在實體化類別的時候,直接指定屬性的值。

// 範例
class Box:
    def constructor():
        pass

    [Property(Value)]
    _value as object

box = Box(Value: 42)
print box.Value

輸出結果

42

你可以看到類別的建構子裏並沒有宣告任何引數,在實體化時,使用 Value: 42 就表示指派 42 給 Value 屬性,語法很簡潔也很具可讀性,對吧~

練習[編輯]

  1. 建立兩個類別:Predator、Prey。為 Predator 類別增加一個 Eat 的方法,用來吃 Prey 。別讓 Prey 被吃兩次囉。

實現一個功能的語法有好幾種,個人認為這沒必要,不要弄得跟C++一樣,定義一個字串有N種寫法,不說各種效率問題,因為這不需要做得像大雜燴一樣.