面向类型编程/有界类型参数
外观
< 面向类型编程
考虑以下代码
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 {}
块中。