Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C# Typen / Klassen als Parameter verwenden (https://www.delphipraxis.net/153949-typen-klassen-als-parameter-verwenden.html)

Meflin 22. Aug 2010 11:25

Typen / Klassen als Parameter verwenden
 
Moin,

in Smalltalk kann ich sowas machen:
Code:
classes := {ClassA. ClassB. ClassC}.
classes do: [:each |
    each register]
(Ja, es geht hierbei um Klassen, nicht Instanzen / Exemplare von Klassen).

In Delphi sollte derartiges ja über das class of Konstrukt auch möglich sein. Ich bräuchte allerdings ein praktikables Äquivalent in C# und da konnte ich bis jetzt nichts finden.

Ein weiterer netter Anwendungsfall wäre dann
Code:
void foo(ASuperClass c) {
    bar = new c()
}

implementation 22. Aug 2010 11:59

AW: Typen / Klassen als Parameter verwenden
 
Ein solches Konstrukt gibt es in C# nicht. Habe ich auch schon vergeblich nach gesucht :?
Es ließe sich aber evtl. durch Generics lösen:
Code:
void foo<T>() where T: BasisKlasse, new()
{
  bar = new T();
}
// ...
foo<BasisKlasse>();
foo<AbgeleiteteKlasse>();
Dann muss die übergebene Klasse aber auch einen Konstruktor mit 0 Argumenten besitzen.

Meflin 22. Aug 2010 13:34

AW: Typen / Klassen als Parameter verwenden
 
Zitat:

Zitat von implementation (Beitrag 1044083)
Ein solches Konstrukt gibt es in C# nicht. Habe ich auch schon vergeblich nach gesucht :?

Verdammt, das ist schade :(

für das zweite Beispiel sollte das mit den Generics ausreichend sein, wenn es klappt. Für den ersten hilft das allerdings auch nichts :stupid:

Medium 22. Aug 2010 16:23

AW: Typen / Klassen als Parameter verwenden
 
Schau dir mal den Namespace System.Type an, und den Operator typeof().

implementation 22. Aug 2010 16:45

AW: Typen / Klassen als Parameter verwenden
 
Heißt das Namespace nicht System.Reflection? :stupid:
Das ist aber eigentlich auch keine Entsprechung für class-of, sondern für die RTTI...
Aber damit sollte sich das erste Beispiel bewältigen lassen.

Meflin 22. Aug 2010 17:18

AW: Typen / Klassen als Parameter verwenden
 
Zitat:

Zitat von implementation (Beitrag 1044147)
Aber damit sollte sich das erste Beispiel bewältigen lassen.

Naja nicht ganz. Zwar kann man damit sowas anlegen:
Code:
Type[] KnownClasses = new Type[] { typeof(ClassA), typeof(ClassB) };
Aber wie komme ich nun vom Type wieder zur Klasse? Ein Eintrag aus dem Array kennt ja nun logischerweise die (statischen) Methoden meiner Klassen nicht (ist ja auch vom Typ Type) und ein cast ist nicht möglich :(
Code:
foreach (Type t in KnownClasses) {
    // ? t.foo()
}

implementation 22. Aug 2010 17:24

AW: Typen / Klassen als Parameter verwenden
 
Die Lösung ist eine Methode von System.Type, nämlich InvokeMember :wink:

Khabarakh 22. Aug 2010 17:28

AW: Typen / Klassen als Parameter verwenden
 
Ich denke, ein konkretes Anwendungsbeispiel wäre langsam hilfreich :) . Von Dependency Injection bis zu Funktionaler Programmierung (Higher-Order-Functions) gibt es manchmal sogar bessere Lösungen als virtuelle statische Methoden.

Eine virtuelle statische Methode direkt umzusetzen, ohne Verlust von statischer Typisierung, wirst du aber nur erreichen, indem du sie zur Instanzmethode machst und dafür ggf. in eine eigene Klasse auslagerst.

implementation 22. Aug 2010 17:35

AW: Typen / Klassen als Parameter verwenden
 
Zitat:

Zitat von Khabarakh (Beitrag 1044164)
Von Dependency Injection bis zu Funktionaler Programmierung (Higher-Order-Functions) gibt es manchmal sogar bessere Lösungen als virtuelle statische Methoden.

In C# gibt es nicht einmal virtuelle statische Methoden :wink:
Daher ist das erste Beispiel sowieso Schwachsinn.
Da müsste Microsoft erstmal Delphi's Klassenmethoden abgucken.:lol:

Meflin 22. Aug 2010 17:38

AW: Typen / Klassen als Parameter verwenden
 
Zitat:

Zitat von Khabarakh (Beitrag 1044164)
Ich denke, ein konkretes Anwendungsbeispiel wäre langsam hilfreich :) .

Nungut... es soll eine Reihe von "Events" verwaltet werden... Im Endeffekt Daten, die über einen Socket empfangen werden. Für jeden möglichen Befehl gibt es eine Unterklasse von
Code:
    abstract class ServerEvent
    {
        public static string command() {
            return "";
        }

        public static void handler() { } 
    }
Alle bekannten Events sollen nun bei einem Dispatcher registriert werden (der ServerEvent.Command aus den TCP Daten liest und dann ServerEvent.handler() passend aufruft).

Mit der im Eingangspost gezeigten Smalltalk-Variante wäre ich da voll zufrieden :stupid:

Vermutlich gibt es dafür auch völlig andere Lösungsansätze; sollte meine Idee tatsächlich nur schwer umsetzbar sein, werde ich wohl auch umstellen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz