跳轉到內容

面向型別程式設計/受限屬性

來自華夏公益教科書,開放的書籍,開放的世界

雖然子型別通常是擴充性的,也就是說,子型別包含其超型別的所有屬性,但在某些情況下,從子型別中移除繼承的屬性很有用。例如,複數具有實部和虛部。每個實數也是複數,但其虛部始終等於零,因此我們不希望此屬性佔用例項中的空間。但是,我們不能完全移除虛部,因為它可能會被用於處理複數的程式碼。我們可以做的是為屬性分配一個固定值

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

華夏公益教科書