Gox语言中的对象类及面向对象编程-GX11.1

Gox语言支持一般意义上的面向对象编程,一个最简单的例子如下:

Person = class {
	fn setName(s) {
		this.name = s
	}

	fn say(s) {
		println(this.name, "says", s)	
	}
}

person1 = new Person

person1.setName("Tom")

person1.say("Hello!")

代码运行结果如下:

Tom says Hello!

可以看出,一般面向对象编程中的基本的封装概念被很好地支持了。

构造函数可以用下面的方法来实现:

Person = class {
	fn _init(nameA) {
		this.setName(nameA)
	}

	fn setName(s) {
		this.name = s
	}

	fn say(s) {
		printfln(`%v says "%v".`, this.name, s)	
	}
}

person2 = new Person("Jerry")

person2.say("I'm fine.")


也就是在类声明中名为_init的函数就是构造函数。这样声明了构造函数后,用关键字new来创建类实例的时候,就需要带参数了,即_init函数所需的参数。目前构造函数不支持重载,因此最多只能有一个_init函数,可以结合使用可变个数参数以及Gox本来就支持的动态类型来实现一定意义上的重载。

另外可以看出,Gox语言中类型的成员变量无需事先声明,可以用到时再引用。

例如:

Person = class {
	fn _init(argsA...) {
		lenT = len(argsA)

		if lenT > 0 {
			this.name = argsA[0]
		}

		if lenT > 1 {
			typeT = type(argsA[1]).String()
			if typeT == "string" {
				this.gender = argsA[1]
			} else {
				this.age = argsA[1]
			}
		}

		if lenT > 2 {
			typeT = type(argsA[2]).String()
			if typeT == "int" {
				this.age = argsA[2]
			} else {
				this.gender = argsA[2]
			}
		}

		if this.age == undefined {
			this.age = "unknown"
		}
	}

	fn info() {
		printfln(`Name: %v, Gender: %v, Age: %v`, this.name, this.gender, this.age)	
	}
}

person3 = new Person("Lisa", "female", 18)

person3.info()

person4 = new Person("Michael", "male")

person4.info()

person5 = new Person("Tony", 9)

person5.info()





本例中,对象类Person的构造函数_init接受的就是可变参数,然后根据参数个数和类型分别将前三个参数赋值入不同的成员。注意判断对象类是否含有某个成员,也是判断其是否等于undefined即可。

代码的执行结果是:

λ gox class3.gox
Name: Lisa, Gender: female, Age: 18
Name: Michael, Gender: male, Age: unknown
Name: Tony, Gender: undefined, Age: 9

可以清楚地看出,虽然只有一个构造函数,但是实现了一般语言中的多个构造函数重载才能实现的功能,也是比较方便的。

至于类方法(或者叫做类的静态方法)也是支持的,可以看这个例子:

Times = class {
	fn add(timeA, durationA) {
		return timeA.Add(durationA)
	}

	fn sub(time1, time2) {
		return time1.Sub(time2)
	}
}

t1 = time.now()

printfln("t1 + 3min = %v", Times.add(nil, t1, time.Second * 60))

instance1 = new Times

printfln("%v", instance1.add(t1, time.Second * 60))

可以看出,如果定义一个类的静态方法,调用该方法时需要比函数的声明中多传递一个参数,可以填入nil,所以还是生成一个实例后再调用更好理解一些。

最后,Gox语言中支持Go语言标准库中的大部分,需要使用的时候直接引用即可,无需进行导入或显式声明。例如本例中就用到了Go语言标准库中time包的Now函数获取当前系统时间,然后用到了time包中的Add函数和Sub函数来进行时间的加减操作。注意,Gox语言中约定,一般函数都改成小写字母开头,结构体或成员变量则用大写字母开头,这与Go语言中略有不同,因此Now函数变成了小写开头。另外,如果用到的包是多级的,一般用下面的方式引用:

net_http.Client

即对原为“net/http”包引用的话,需要把斜杠字符换成下划线,变成“net_http”。

猜你喜欢

转载自blog.csdn.net/weixin_41462458/article/details/107850799