面向类型编程/有界类型参数
外观
< 面向类型编程
考虑以下代码
type Equatable {
func equals(x Any) Bool
}
type Complex : Equatable {
property real Float
property imag Float
func equals(x Any) Bool {
if x is Complex then {
var x = x as Complex
return self.real == x.real & self.imag == x.imag
}
return false
}
}
type Pair[T] {
property first T
property second T
}
main {
var x = new Complex { real=2.0, imag=3.0 }
var y = new Complex { real=2.0, imag=3.0 }
return x.equals(y)
}
我们现在想为Pair实现equals方法
func equals(p Pair[T]) Bool {
return self.first.equals(p.first) & self.second.equals(p.second)
}
但是请注意,这段代码无法编译,因为编译器无法确定T是否代表可比较类型。我们需要修改Pair的声明为
type Pair[T:Equatable] { ... }
现在,可以确保T是可比较的,并且我们可以检查对等的相等性
main {
var x = new Complex { real=2.0, imag=3.0 }
var y = new Complex { real=2.0, imag=4.0 }
var p1 = new Pair[Complex] { first=x, second=y }
var p2 = new Pair[Complex] { first=x, second=y }
return p1.equals(p2)
}
这里,T类型参数称为有界的,因为对其施加了类型约束。
注意:可以使用 Funcy 应用程序尝试此伪代码,该应用程序可以从Apple 的 App Store (iOS/macOS)、Google Play (Android) 或Amazon Appstore免费下载。要执行的代码必须放在main {}块中。