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种写法,不说各种效率问题,因为这不需要做得像大杂烩一样.