面向类型编程/受限属性
外观
< 面向类型编程
虽然子类型通常是扩充性的,也就是说,子类型包含其超类型的所有属性,但在某些情况下,从子类型中移除继承的属性很有用。例如,复数具有实部和虚部。每个实数也是复数,但其虚部始终等于零,因此我们不希望此属性占用实例中的空间。但是,我们不能完全移除虚部,因为它可能会被用于处理复数的代码。我们可以做的是为属性分配一个固定值
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 {}
块中。