2012-07-09 10 views
5

estoy portar algunos de Java de código de Dart y que se utiliza mucho estos tipos de mapas:Mapa de Clase en Dart

Map<Class<? extends SomeClass>, SomeOtherClass> map = new HashMap<>(); 

Por el momento esto parece ser imposible en dardo. Soy consciente de que hay una propuesta para introducir primeros tipos de niveles: http://news.dartlang.org/2012/06/proposal-for-first-class-types-in-dart.html que pudieran suponer

class Type { 
    @native String toString(); 
    String descriptor(){...} // return the simple name of the type 
} 

Así que hasta que esta propuesta se implementa He creado la clase siguiente:

class Type { 
    final String classname; 
    const Type(this.classname); 
    String descriptor() => classname; 
} 

y las clases en las que necesito tiene un simple método get

abstract Type get type(); 

de esa manera puedo usar mi Type al igual que yo usaría el verdadero Type una d para cambiar más tarde, solo tendría que eliminar mi solución.

Mi pregunta: ¿Hay algún truco de hacer este tipo de mapeo (que no estoy viendo) o es la forma en que lo hago una solución razonable hasta que se introduce la clase real Type?

Actualización para dardo 1.0

Se puede hacer de esta manera:

var map = new Map<Type, SomeOtherClass>(); 
// either 
map[SomeOtherClass] = new SomeOtherClass(); 
// or 
var instance = new SomeOtherClass(); 
map[instance.runtimeType] = instance; 

Respuesta

4

actualización: esta construcción no es actualmente factible en Dart

Map<Class<? extends SomeClass>, SomeOtherClass> 

tendrá esperar .type/.class a arriv e para una solución elegante a esto (muchos de nosotros, los Dartisanos, esperamos que esto llegue más pronto que tarde). Sin embargo, para el caso más simple

Map<? extends SomeClass, SomeOtherClass> 

Usted sólo puede hacer

Map<SomeClass, SomeOtherClass> aMap; 

como en Dart cualquier clase que se extiende SomeClass también va a ser una válida SomeClass. Por ejemplo, si se ejecuta el siguiente código en modo verificado:

main() { 
    Map<Test, String> aMap = new HashMap<Test, String>(); 
    var test = new Test("hello"); 
    var someTest = new SomeTest("world"); 
    var notATest = new NotATest(); 

    aMap[test] = test.msg; 
    aMap[someTest] = someTest.msg; 
    aMap[notATest] = "this fails"; 
} 

class Test implements Hashable { 
    Test(this.msg); 

    int hashCode() => msg.hashCode(); 

    final String msg; 
} 

class SomeTest extends Test { 
    SomeTest(String message): super(message); 
} 

class NotATest implements Hashable { 
    int hashCode() => 1; 
} 

entonces se obtendrá el error:

type 'NotATest' is not a subtype of type 'Test' of 'key'. 
+0

en su ejemplo la llave en el mapa es una instancia de la clase Test, pero Necesito que la clase sea la clave, no la instancia ... oh veo, mi código Java está equivocado –

+1

actualicé mi pregunta ... –