Sto cercando di scrivere una funzione in una superclasse Dart che prende azioni diverse a seconda di quale sottoclasse è in realtà utilizza. Qualcosa di simile a questo:Accensione tipo di classe a Dart
class Foo {
Foo getAnother(Foo foo) {
var fooType = //some code here to extract fooType from foo;
switch (fooType) {
case //something about bar here:
return new Bar();
case //something about baz here:
return new Baz();
}
}
}
class Bar extends Foo {}
class Baz extends Foo {}
dove l'idea è che ho qualche oggetto e vuole ottenere un nuovo oggetto dello stesso (sotto) categoria.
La questione principale è che tipo dovrebbe essere fooType
? Il mio primo pensiero è stato Symbol, che porta a semplici case statement come case #Bar:
, ma non so come popolarecon un simbolo. Le uniche opzioni che posso pensare è fare qualcosa di simile Symbol fooType = new Symbol(foo.runtimeType.toString());
ma la mia comprensione è che runtimeType.toString()
non funzionerà quando convertito in javascript. Si potrebbe aggirare questo usando Mirrors, ma questo è pensato per essere una libreria leggera, quindi quelli non sono sul tavolo. Object.runtimeType
restituisce qualcosa della classe Type
, ma non ho idea di come creare istanze di Type
potrei usare per le istruzioni case. Forse mi manca qualche altro pezzo della libreria Dart che è più adatto per questo?
comportamento speciale per sottoclassi, a seconda della classe: Questo suona esattamente come quello che le funzioni virtuali sono destinati a risolvere. Che ne dici di avere: 'class Foo {Foo _createNew() => new Foo(); Foo getAnother (Foo foo) => foo._createNew(); } 'e quindi' class Bar estende Foo {_createNew() => new Bar(); } 'e simili per' Baz'? – lrn