面向类型编程/受限属性
外观
< 面向类型编程
虽然子类型通常是扩充性的,也就是说,子类型包含其超类型的所有属性,但在某些情况下,从子类型中移除继承的属性很有用。例如,复数具有实部和虚部。每个实数也是复数,但其虚部始终等于零,因此我们不希望此属性占用实例中的空间。但是,我们不能完全移除虚部,因为它可能会被用于处理复数的代码。我们可以做的是为属性分配一个固定值
type Complex {
property real Float
property imag Float
func _add(x Complex) Complex {
return new Complex {
real=self.real+x.real,
imag=self.imag+x.imag
}
}
func _mul(x Complex) Complex {
return new Complex {
real=self.real*x.real-self.imag*x.imag,
imag=self.real*x.imag+self.imag*x.real
}
}
func description() String {
return self.real.description() + "+" + self.imag.description() + "i"
}
}
type Real : Complex {
restrict imag Float = 0.0
}
main {
var x = new Complex { real=2.0, imag=3.0 }
var y = new Real { real=2.0 }
return (x*y).description()
}
请注意,Real 类型现在只有一个存储属性,但 Complex 类型中的方法仍然可以与子类型一起使用。
注意:可以使用 Funcy 应用程序试用伪代码,该应用程序可以从 Apple 的 App Store (iOS/macOS)、Google Play (Android) 或 Amazon Appstore 免费下载。要执行的代码必须放在 main {} 块中。