作为封装了数据结构的类,不仅仅是封装了对象的属性,还封装了属性相关的操作。这些操作,在类里面这就叫方法,在有的面向对象术语里也叫消息,或者成员函数,因为像属性一样,依附于某一个对象。但是不只叫函数,因为函数我们往往特制独立的程序模块,不依赖于类而存在。
按照惯常的说法,函数是一等公民,类也是,函数与类是一个等级的,而类的各种类型的方法是从属于类的,没有类就没有所谓类的各种类型的方法。
实例方法
实例方法,在类的内部的定义和实现上看起来同函数没有区别,不过是能直接访问类的属性。
在访问类的属性时,直接引用属性的名称即可,当然也可以加一个“self”前缀。类的每个实例都有一个隐含属性self,self方法等同于该实例本身。
class Rect
{
var width:Int = 0
var height:Int = 0
fun setSize(w:Int,height:Int)
{
width = w
self.height = height
}
func getArea()->Int
{
return width*height
}
}
var rect = Rect()
rect.setSize(10,height:20)
println(rect.getArea())
类型方法
正如类的变量属性一样,必须依附于某个具体的类实例而存在,不能直接调用。
类型方法不属于任何一个类,而是属于公共的类,可以通过类名直接调用,但是正是如此,它也不能调用变量属性,因为使用类型方法,并不需要初始化类,没有空间存储对象,因而也并没有空间来保存对象。类型方法在其他语言中,一般称之为静态方法或者类方法。
类型方法的定义:
class Rect
{
private struct swidth{static var width:Int = 0}
public class var width:Int
{
get{return swidth.width}
set{swidth.width = newValue}
}
private struct sheight{static var height:Int = 0}
public class var height:Int
{
get{return sheight.width}
set{swidth.height = newValue}
}
class func getArea()->Int
{
Rect.width = w
Rect.height = height
}
class func getArea() ->Int
{
return Rect.width * Rect.height
}
}
在类型方法setSize的内部,我们也不再使用self这样的关键字。因为在类型方法的定义中,使用self是不允许的,因为self代表的是当前实例,而类型方法被调用时不依存于任何实例,所以在类型方法中,只能使用类型属性,而不能使用一般的实例属性。