跳转到内容

面向类型编程/受限属性

来自维基教科书,开放的书籍,开放的世界

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

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 {} 块中。

华夏公益教科书