Ich bin ein .NET-Typ, also lass mich zuerst mein Verständnis einiger Java-Konzepte durchsetzen - korrigiere mich, wenn ich falsch liege.. Net-Entsprechung für Java typisierte Klasse <>?
Java Generics unterstützen das Konzept der beschränkten Platzhalter:
class GenericClass< ? extends IInterface> { ... }
... die mit dem .NET where
Einschränkung ähnelt:
class GenericClass<T> where T: IInterface { ... }
Java Class
Klasse beschreibt einen Typ und ist grob entspricht. NET Type
Klasse
So weit, so gut. Aber ich kann keine nahe genug Entsprechung zu Java generisch typisierten Class<T>
finden, wobei T eine begrenzte Wildcard ist. Dies bedeutet grundsätzlich eine Einschränkung für die Typen, die der Class
darstellt.
Lassen Sie mich ein Beispiel in Java geben.
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Class<? extends IExternalSort> customClass
= Class.forName("MyExternalSort")
.asSubclass(IExternalSort.class); //this checks for correctness
IExternalSort impl = customClass.newInstance(); //look ma', no casting!
Der nächstgelegene ich in .NET ist so etwas wie diese bekommen könnte:
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Assembly assy = GetAssembly(); //unimportant
Type customClass = assy.GetType(custSortclassName);
if(!customClass.IsSubclassOf(typeof(IExternalSort))){
throw new InvalidOperationException(...);
}
IExternalSort impl = (IExternalSort)Activator.CreateInstance(customClass);
Die Java-Version sieht sauberer zu mir. Gibt es eine Möglichkeit, das .NET-Gegenstück zu verbessern?
String custSortclassName = GetClassName();
Assembly assy = GetAssembly();
Type customClass = assy.GetType(custSortclassName);
IExternalSort impl = Activator.CreateInstance(customClass) as IExternalSort;
if(impl==null) throw new InvalidOperationException(...);
Aber hier Ich schaffe die Instanz vor der Überprüfung seiner Art, das ein Problem für Sie sein:
Das mag ein bisschen zu einfach sein, aber wäre es nicht möglich, einfach die Einschränkung 'new()' zur Beschränkung where hinzuzufügen? So etwas wie 'MyExternalSort: IExternalSort wo T: IExternalSort, new()' und dann 'var impl = new T();'? Persönlich würde ich das Factory-Muster verwenden, um Instanzen von Typen zu erstellen, die die gleiche Schnittstelle in solchen Szenarien implementieren. –
Carsten
Ich weiß nicht viel über Java-Generics, aber ich weiß, dass sie anders implementiert sind (keine JVM-Unterstützung) und eine Reihe von Dingen unterstützen, die .NET-Generics nicht unterstützen. Also erwarte nicht, ein geradliniges "Äquivalent" für alles zu finden – jalf
@Aschratt Ich sehe nicht, wie das für meine Frage relevant ist. Dieser Trick könnte nützlich sein, wenn alle Typinformationen zur Kompilierzeit bekannt sind, aber der Typ MyExternalSort ist erst zur Laufzeit bekannt - er kann von einem Client meiner Sortierbibliothek implementiert werden und wird nur anhand des Namens angegeben. –