Function Overloading
Inspect one language lane at a time so line-level text and code deltas stay readable.
Diff Lane
English
0 modified sections0 code block delta0 anchor delta
Diff Lane
中文
1 modified sections0 code block delta0 anchor delta
modified函数重载定义text+1 line, -1 line
v1.0.5
Section Text
1
在仓颉编程语言中,如果一个作用域中,一个函数名对应多个函数定义,这种现象称为函数重载。2
3
- 函数名相同,函数参数不同(是指参数个数不同,或者参数个数相同但参数类型不同)的两个函数构成重载。示例如下:4
5
<!-- compile -->6
7
```cangjie8
// Scenario 19
10
func f(a: Int64): Unit {}11
func f(a: Float64): Unit {}12
func f(a: Int64, b: Float64): Unit {}13
```14
15
- 对于两个同名泛型函数 (详见[泛型函数](../generic/generic_function.md#泛型函数)章节),如果重命名一个函数的泛型形参后(使泛型参数顺序相同),其非泛型部分与另一个函数的非泛型部分函数参数不同,则两个函数构成重载,否则这两个泛型函数构成重复定义错误(类型变元的约束不参与判断)。示例如下:16
17
<!-- compile.error -->18
19
```cangjie20
// Scenario 221
22
interface I1{}23
interface I2{}24
25
func f1<X, Y>(a: X, b: Y) {}26
func f1<Y, X>(a: X, b: Y) {} // OK: after rename generic type parameter, it will be 'func f1<X, Y>(a: Y, b: X)'27
28
func f2<T>(a: T) where T <: I1 {} // Error, not overloading29
func f2<T>(a: T) where T <: I2 {} // Error, not overloading30
```31
32
- 同一个类内的两个构造函数参数不同,构成重载。示例如下:33
34
<!-- compile -->35
36
```cangjie37
// Scenario 338
39
class C {40
var a: Int6441
var b: Float6442
43
public init(a: Int64, b: Float64) {44
this.a = a45
this.b = b46
}47
48
public init(a: Int64) {49
b = 0.050
this.a = a51
}52
}53
```54
55
- 同一个类内的主构造函数和 `init` 构造函数参数不同,构成重载(认为主构造函数和 `init` 函数具有相同的名字)。示例如下:56
57
<!-- compile -->58
59
```cangjie60
// Scenario 461
62
class C {63
C(var a!: Int64, var b!: Float64) {64
this.a = a65
this.b = b66
}67
68
public init(a: Int64) {69
b = 0.070
this.a = a71
}72
}73
```74
75
- 两个函数名相同,参数不同的函数定义在不同的作用域,在两个函数都可见的作用域中构成重载。示例如下:76
77
<!-- compile -->78
79
```cangjie80
// Scenario 581
82
func f(a: Int64): Unit {}83
84
func g() {85
func f(a: Float64): Unit {}86
}87
```88
89
- 如果子类中存在与父类同名的函数,并且函数的参数类型不同,则构成函数重载。示例如下:90
91
<!-- compile -->92
93
```cangjie94
// Scenario 695
open class Base {96
public func f(a: Int64): Unit {}97
}98
99
class Sub <: Base {100
public func f(a: Float64): Unit {}101
}102
```103
104
只允许函数声明引入的函数重载,但是以下情形不构成重载,不构成重载的两个名字不能定义或声明在同一个作用域内:105
106
- class、interface、struct 类型的静态成员函数和实例成员函数之间不能重载107
- enum 类型的 constructor、静态成员函数和实例成员函数之间不能重载108
109
如下示例,两个变量均为函数类型且函数参数类型不同,但由于它们不是函数声明所以不能重载,如下示例将编译报错(重定义错):110
111
<!-- compile.error -->112
113
114
如下示例,虽然变量 `f` 为函数类型,但由于变量和函数之间不能同名,如下示例将编译报错(重定义错):115
116
<!-- compile.error -->117
118
119
如下示例,静态成员函数 `f` 与实例成员函数 `f` 的参数类型不同,但由于类内静态成员函数和实例成员函数之间不能重载,如下示例将编译报错:120
121
<!-- compile.error -->Code 1 · cangjie
1
main() {2
var f: (Int64) -> Unit3
var f: (Float64) -> Unit4
}Code 2 · cangjie
1
main() {2
var f: (Int64) -> Unit3
func f(a: Float64): Unit {} // Error, functions and variables cannot have the same name4
}Code 3 · cangjie
1
class C {2
public static func f(a: Int64): Unit {}3
public func f(a: Float64): Unit {}4
}v1.1.0
Section Text
1
在仓颉编程语言中,如果一个作用域中,一个函数名对应多个函数定义,这种现象称为函数重载。2
3
- 函数名相同,函数参数不同(是指参数个数不同,或者参数个数相同但参数类型不同)的两个函数构成重载。示例如下:4
5
<!-- compile -->6
7
```cangjie8
// Scenario 19
10
func f(a: Int64): Unit {}11
func f(a: Float64): Unit {}12
func f(a: Int64, b: Float64): Unit {}13
```14
15
- 对于两个同名[泛型函数](../generic/generic_function.md),如果重命名一个函数的泛型形参后(使泛型参数顺序相同),其非泛型部分与另一个函数的非泛型部分函数参数不同,则两个函数构成重载,否则这两个泛型函数构成重复定义错误(类型变元的约束不参与判断)。示例如下:16
17
<!-- compile.error -->18
19
```cangjie20
// Scenario 221
22
interface I1{}23
interface I2{}24
25
func f1<X, Y>(a: X, b: Y) {}26
func f1<Y, X>(a: X, b: Y) {} // OK: after rename generic type parameter, it will be 'func f1<X, Y>(a: Y, b: X)'27
28
func f2<T>(a: T) where T <: I1 {} // Error, not overloading29
func f2<T>(a: T) where T <: I2 {} // Error, not overloading30
```31
32
- 同一个类内的两个构造函数参数不同,构成重载。示例如下:33
34
<!-- compile -->35
36
```cangjie37
// Scenario 338
39
class C {40
var a: Int6441
var b: Float6442
43
public init(a: Int64, b: Float64) {44
this.a = a45
this.b = b46
}47
48
public init(a: Int64) {49
b = 0.050
this.a = a51
}52
}53
```54
55
- 同一个类内的主构造函数和 `init` 构造函数参数不同,构成重载(认为主构造函数和 `init` 函数具有相同的名字)。示例如下:56
57
<!-- compile -->58
59
```cangjie60
// Scenario 461
62
class C {63
C(var a!: Int64, var b!: Float64) {64
this.a = a65
this.b = b66
}67
68
public init(a: Int64) {69
b = 0.070
this.a = a71
}72
}73
```74
75
- 两个函数名相同,参数不同的函数定义在不同的作用域,在两个函数都可见的作用域中构成重载。示例如下:76
77
<!-- compile -->78
79
```cangjie80
// Scenario 581
82
func f(a: Int64): Unit {}83
84
func g() {85
func f(a: Float64): Unit {}86
}87
```88
89
- 如果子类中存在与父类同名的函数,并且函数的参数类型不同,则构成函数重载。示例如下:90
91
<!-- compile -->92
93
```cangjie94
// Scenario 695
open class Base {96
public func f(a: Int64): Unit {}97
}98
99
class Sub <: Base {100
public func f(a: Float64): Unit {}101
}102
```103
104
只允许函数声明引入的函数重载,但是以下情形不构成重载,不构成重载的两个名字不能定义或声明在同一个作用域内:105
106
- class、interface、struct 类型的静态成员函数和实例成员函数之间不能重载107
- enum 类型的 constructor、静态成员函数和实例成员函数之间不能重载108
109
如下示例,两个变量均为函数类型且函数参数类型不同,但由于它们不是函数声明所以不能重载,如下示例将编译报错(重定义错):110
111
<!-- compile.error -->112
113
114
如下示例,虽然变量 `f` 为函数类型,但由于变量和函数之间不能同名,如下示例将编译报错(重定义错):115
116
<!-- compile.error -->117
118
119
如下示例,静态成员函数 `f` 与实例成员函数 `f` 的参数类型不同,但由于类内静态成员函数和实例成员函数之间不能重载,如下示例将编译报错:120
121
<!-- compile.error -->Code 1 · cangjie
1
main() {2
var f: (Int64) -> Unit3
var f: (Float64) -> Unit4
}Code 2 · cangjie
1
main() {2
var f: (Int64) -> Unit3
func f(a: Float64): Unit {} // Error, functions and variables cannot have the same name4
}Code 3 · cangjie
1
class C {2
public static func f(a: Int64): Unit {}3
public func f(a: Float64): Unit {}4
}