BOO入門/方法
定義方法
[编辑]方法必須定義在類別裡。定義的方法就與函數一樣。
// 方法的範例
class Cat:
def Roar():
pring "Meow!"
#修正 上面這此行更正為 print "Meow!"
cat = Cat()
cat.Roar()
輸出結果
Meow!
首先得先把 Cat 實體化為物件,然後才能使用它的方法。
類別建構子與解構子
[编辑]建構子與解構子是特別的方法,它們會在類別被實體化或被消滅時被呼叫。這兩者可有可無。
// 建構子與解構子範例
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。
在建構子裡宣告屬性
[编辑]Boo 提供了一個非常有用的特性,它讓你可以在實體化類別的時候,直接指定屬性的值。
// 範例
class Box:
def constructor():
pass
[Property(Value)]
_value as object
box = Box(Value: 42)
print box.Value
輸出結果
42
你可以看到類別的建構子裡並沒有宣告任何引數,在實體化時,使用 Value: 42 就表示指派 42 給 Value 屬性,語法很簡潔也很具可讀性,對吧~
練習
[编辑]- 建立兩個類別:Predator、Prey。為 Predator 類別增加一個 Eat 的方法,用來吃 Prey 。別讓 Prey 被吃兩次囉。
实现一个功能的语法有好几种,个人认为这没必要,不要弄得跟C++一样,定义一个字串有N种写法,不说各种效率问题,因为这不需要做得像大杂烩一样.