C# Instanz einer vererbten Klsse erstellen; Java -> C#

xparet0209

Ensign
Registriert
Okt. 2007
Beiträge
180
Hi Cb'ler
ich habe folgenden Java-Quellcode, den ich in C# übersetzen möchte:
PHP:
/**
 * Erlaubt es verschiedene Logiken zu verwenden und eine davon auszuwählen und
 * Instanzen dieser Logik zu erzeugen
 * 
 * @author and
 */
public enum LogicFactory {
    // Verfügbare Taktiken (Implementierungen des IGameHandler) müssen hier
    // eingetragen wie im Beispiel eingetragen und ihre Klasse angegeben werden
    RANDOM(RandomLogic.class),

    TEST(TestLogic).class,
    
    // Die Logik die gewählt wird, wenn kein passender Eintrag zu der Eingabe
    // gefunden wurde:
    DEFAULT(RandomLogic.class);

    private Class<? extends IGameHandler> logic;

    private LogicFactory(Class<? extends IGameHandler> chosenLogic) {
        logic = chosenLogic;
    }

    /**
     * Erstellt eine Logik-Instanz und gibt diese zurück
     * 
     * @param client
     *            Der aktuelle Client
     * @return Eine Instanz der gewaehlten Logik
     * @throws Exception
     *             Wenn etwas schief gelaufen ist und keine Instanz erstellt
     *             werden konnte, wird eine Exception geworfen!
     */
    public IGameHandler getInstance(AbstractClient client) throws Exception {
        System.out.println("Erzeuge Instanz von: " + name());
        return (IGameHandler) logic.getConstructor(client.getClass()).newInstance(client);
    }

}
Das heißt ich habe einen Clienten, der eine Logik zugewiesen bekommen soll, duch
PHP:
logic = LogicFactory.valueOf("RANDOM").getInstance(client);
Eine solche Logik muss im enum von der LogikFactory angegeben sein und vom IGameHandler
erben. Mein Problem ist nun, wie übersetze ich
PHP:
Class<? extends IGameHandler
in C#? Die enums kann ich ja umschreiben in folgendes: (glaube ich)

PHP:
 public enum LogicFactory {
    RANDOM=RandomLogic,
    TEST = TestLogic,
    DEFAULT=RandomLogic
    }
Doch ich kann kein Objekt erstellen, von dessen Typ ich nur weiß dass sie vom IGameHandler erbt.
Kennt ihr vllt einen Weg das in C# auszudrücken?

mfg xparet0209
 
Zuletzt bearbeitet:
Ich bin mir zwar nicht sicher, jedoch sind enums statische Typen, die nicht erweitert werden können. Du könntest eine Klasse mit statischen Attributen definieren und diese eweitern?
 
Ich fürchte, bei dem Ansinnen, das 1:1 umzusetzen, wirst Du Probleme bekommen.

1.)
Die Enums in Java sind ja auf eine sehr eigenwillige Art (mir gefällts^^) umgesetzt als Klassen. Das ist in C# nicht so, und ein Enum zu einer Factory umzufunktionieren wird nicht tun, dafür können Enums in C# zu wenig. Hier wirst Du das Factory-Pattern implementieren, oder mit statischen Membern auskommen müssen:

PHP:
class LogicFactory {
    public static LogicFactory RANDOM = new LogicFactory(typeof(RandomLogic));
    ...
    
    Type _logic;

    ///<summary>Default-Konstruktor ist private, es gibt nur 2 Instanzen.</summary>
    LogicFactory(Type aLogic) : base() {
        _logic = aLogic;
    }

    public IGameHandler GetInstance(AbstractClient client) {
        return _logic.GetConstructor(new [] { typeof(client) }).Invoke(new [] { client });
    }

}

2.)
Generics in C# funktionieren anders als in Java. Ein List<string> ist != "typeof" List<object>, dh Generics existieren in C# auch zur Laufzeit und repräsentieren jeweils eigen Typen. Aus diesem Grund muss man in C# auch etwas anders damit umgehen - in Java kann man ja recht unbedarft alles generisch machen^^ Ich vermute, aus diesem Grund hat man auch darauf verzichtet, das Class<T>-Pendant in C# (alias "System.Type") generisch zu gestalten. Wenn Du also sicherstellen willst, dass nur Type-Objekte für ein bestimmtes Interface übergeben werden, muss dies anders gelöst werden.
 
Zuletzt bearbeitet:
Zurück
Oben