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