Hallo allerseits
Ich kämpfe seit einigen Stunden daran, die Enumeration Klasse irgendwie zu "extenden". Es geht im wesentlichen um diese Bemerkung im Kommentar:
siehe den Quellcode hier: Scala Standard Library 2.9.1.final
Ich hab's ein wenig vereinfacht, und auf dieses etwas kürzere Beispiel heruntergebrüht:
Der code funktioniert natürlich nicht, es soll nur demonstrieren, dass das erzeugen von neuen klassen mit gleichen namen nichts bringt: es werden stets die alten konstruktoren verwendet, und der typ der Values bleibt SimplifiedEnum#Value und nicht ExtendedEnum#Value.
Ich verstehe überhaupt nicht was der gute Herr Zenger hier gemeint hat: wie soll ich denn die Klasse "überschreiben"?
Irgendwelche wenig erleuchtende diskussionen darüber gab' schon bei Stack Overflow:
Overriding Scala Enumeration Value - Stack Overflow
Hier wird heldenhaft die Val Klasse überschrieben, das ändert aber immer noch nichts daran, dass zB. die [c]values()[/c]-Methode den alten typ [c]Set[SimplifiedEnumeration#Value][/c] zurückgibt.
enums - How does one "override" an inner class in Scala? - Stack Overflow
Hier wird die siskussion mit einem "Hm?" beendet, was mich auch nicht weiterbringt.
Kann das sein, dass man hier eigentlich einen virtuellen [c]type[/c] bräuchte, also den genauen type von Value erstmal variabel lassen sollte?
Ich kämpfe seit einigen Stunden daran, die Enumeration Klasse irgendwie zu "extenden". Es geht im wesentlichen um diese Bemerkung im Kommentar:
Code:
201 /** A class implementing the <a href="Enumeration.Value.html"
202 * target="contentFrame">`Value`</a> type. This class can be
203 * overridden to change the enumeration's naming and integer identification
204 * behaviour.
205 */
Ich hab's ein wenig vereinfacht, und auf dieses etwas kürzere Beispiel heruntergebrüht:
Code:
// gaanz grobe skizze von Enumeration
class SimplifiedEnum{
// alle instanzen werden mit hilfe einer factory-methode erzeugt
// heisst im original
// protected final def Value(i: Int, name: String): Value = new Val(i, name)
protected final def Value = new Val
// abstrakte Value-Klasse
abstract class Value{
def bar(): Unit
}
// implementierung der Value classe, die irgendwie "ueberschrieben" werden soll
protected class Val extends Value{
def bar() = println("bar")
}
}
// Erweiterung der Enumeration
class ExtendedEnum extends SimplifiedEnum{
abstract class Value extends super.Value{
// Versuch, eine neue funktionalitaet an Value dranzukleben
def baz(): Unit
}
protected class Val extends Value{
// implementierung der neuen funktionalitaet
def baz() = println("new functionality, yuhu")
}
}
object OverrideClassTest{
// Anwendung der neuen ExtendedEnum klasse
object MyExtEnum extends ExtendedEnum{
val A = Value
val B = Value
}
import MyExtEnum._
def main(ignored: Array[String]){
A.baz() // nix geht
}
}
Ich verstehe überhaupt nicht was der gute Herr Zenger hier gemeint hat: wie soll ich denn die Klasse "überschreiben"?
Irgendwelche wenig erleuchtende diskussionen darüber gab' schon bei Stack Overflow:
Overriding Scala Enumeration Value - Stack Overflow
Hier wird heldenhaft die Val Klasse überschrieben, das ändert aber immer noch nichts daran, dass zB. die [c]values()[/c]-Methode den alten typ [c]Set[SimplifiedEnumeration#Value][/c] zurückgibt.
enums - How does one "override" an inner class in Scala? - Stack Overflow
Hier wird die siskussion mit einem "Hm?" beendet, was mich auch nicht weiterbringt.
Kann das sein, dass man hier eigentlich einen virtuellen [c]type[/c] bräuchte, also den genauen type von Value erstmal variabel lassen sollte?
Zuletzt bearbeitet: