Frage

Ich brauche für Mengen mit Einheiten zu unterstützen. Ich mag die Art Systemeinheit Korrektheit so viel wie möglich zu erzwingen. Zum Beispiel sollte es nicht möglich sein Gramm mit Dollar zu kombinieren. Ich werde den Weg der parametrisierte Typen nach unten, aber dieser Code scheint weit mehr als repetitious Scala Code, den ich von anderen gesehen habe.

abstract class UnitOfMeasure

abstract class Range[T] {
  type T <: UnitOfMeasure
}
class Quantity[T <: UnitOfMeasure](value: Double)
class DefiniteRange[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T]) extends Range[T]
class Confidence(conf: Double) {
  require(0.0 <= conf && conf <= 1.0)
}
class ConfidenceInterval[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T], confidence: Confidence) extends Range[T] {
    def this(lower: Quantity[T], upper: Quantity[T]) = this(lower, upper, new Confidence(.90))
}

Gibt es einen sauberen Weg, dies zu tun? Der Paukenschlag von. „T <: UnitOfMeasure“ ist die Hauptsache, die mich stört

War es hilfreich?

Lösung

Andere Tipps

Ich habe das Buch nicht, aber vielleicht ein selbst Typ ist, was du brauchst. Sie können Ihre Klassen in einer anderen Klasse umschließen und Ihre Typdefinition hinzufügen, in dem Klassenbereich verwendet werden.

Von mdmcnlly:

  

Ich erinnere sehen ein Beispiel in der   Programmierung in Scala Buch, das dealth   mit einem Basistyp von Tieren, die eine hatten   kompatibel Lebensmittel und Subtypen,   essen kann nur ihre kompatibel   Subtyp und nicht Nahrung für andere. ich   fühle mich wie es verwandt ist, aber ich bin nicht   sicher. Vielleicht hat jemand mit dem Buch   praktisch die guten Nuggets herauszukitzeln kann.   Der Kern der Lösung ist die Verwendung   Typ Mitglieder einer Basisklasse statt   dieser Varianz Annotationen in aller   der richtige Ort.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top