Laden...

Polymorphes Verhalten einer statischen Methode [basierend auf generischem Typparameter T]

Erstellt von Rabban vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.992 Views
Rabban Themenstarter:in
106 Beiträge seit 2011
vor 12 Jahren
Polymorphes Verhalten einer statischen Methode [basierend auf generischem Typparameter T]

Hallo Gemeinde,

ich habe ein Problem eine statische Methode polymorph an die Kindklassen abzuleiten.
In csharp scheint dies leider nicht möglich zu sein.

Aufgabensetzung hierbei ist:
Die Elternklasse muss eine statische Methode bereitstellen die einen String zurückgibt, die gleiche Methode müssen auch die abgeleiten Kindklassen implementieren, da ich zur Laufzeit nur die Elternklasse entgegen nehmen kann und ich hoffte die Methode Polymorph nutzen zu können.

Ich habs auch mit einer Konstante versucht (da für mich nur entsheidend ist das ich an den String komme, muss es nicht zwangsläufig eine Methode sein, wichtig ist nur das ich statisch drauf zugreifen kann), aber die kann ich auch nicht überschreiben, nur mit new überdecken, aber dann hätte ich wieder kein Polymorphes verhalten.

Habt ihr einen Vorschlag oder Denkanstoß wie ich dieses verhalten trotzdem erzeugen kann?

MfG
Rabban

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Rabban,

In csharp scheint dies leider nicht möglich zu sein.

so ist es. Polymorphes Verhalten von Methoden (ich spreche lieber von dynamischer Bindung), gibt es nur bei Instanzmethoden. Das lässt sich nicht ändern.

Je nachdem, was genau dein Problem ist, könnte es aber eine Lösung sein, Singletons zu verwenden. Aber auch da brauchst du natürlich das Singleton Objekt der passenden Klasse, damit die richtige Methode aufgerufen wird.

da ich zur Laufzeit nur die Elternklasse entgegen nehmen kann

Was genau meinst du damit? Was bekommst du übergeben? Woran kannst du erkennen oder entscheiden, die Methode welcher Klasse aufgerufen werden soll?

herbivore

Rabban Themenstarter:in
106 Beiträge seit 2011
vor 12 Jahren

Was genau meinst du damit? Was bekommst du übergeben? Woran kannst du erkennen oder entscheiden, die Methode welcher Klasse aufgerufen werden soll?

Ich habe eine abstrakte Basisklasse, von der ich mehrere verschiedene Klassen ableite.

Nun habe ich eine Klasse(Search), der ich generisch eine andere Klasse übergeben kann:


class Search<T> : where T : BaseClass, new()
    {
        public void search()
        {
                //BaseClass methode aufrufen
                string s = T.getString();
        }
    }

ich hab das unwesentliche mal rausgekürzt.
Wie hier zu sehen, wird vorrausgesetzt das T BaseClass bzw. ein Kind davon ist. Somit habe ich zugriff auf alle benötigten Methoden von BaseClass, bzw. die dynamisch gebundenen der Kindklasse. Bis hierhin ist alles richtig und gewollt.

Nun muss mir aber jede Kindklasse einen bestimmten Individuellen String zurückgeben, der nur auf die Klasse zutrifft. Das heisst, dieser String ist für die Klasse immer gleich und kann (bzw. es wäre wünschenswert) statisch sein.
Also:


string s = T.getString();

Ich hätte zwar die möglichkeit von T eine Instanz zu erstellen, dazu müsste ich aber in jeder Kindklasse einen DummyKonstruktor definieren um ein leeres Objekt zu erzeugen. Dies ist aber nicht wirklich in meinem Sinne.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt 😉
Mittlerweile habe ich aber immer mehr das Gefühl, das ich wohl gesamt einen falschen Weg beschritten habe um das Problem zu lösen.

MfG
Rabban

656 Beiträge seit 2008
vor 12 Jahren

Mittlerweile habe ich aber immer mehr das Gefühl, das ich wohl gesamt einen falschen Weg beschritten habe um das Problem zu lösen.

So kommts mir auch vor 😃

Gibt es einen triftigen Grund, warum du T als generischen Parameter reingibst (außerdem mit new()-Constraint), und nicht einfach nur auf einer Instanz der Basisklasse arbeitest; mit "normalen" abstract/virtual Methoden?

Irgendwie riecht das ganze nach einer Art O/R-Mapper, Serializer oder so, und dein T.getString() ist eine Art Kennzeichen für die spezifische Subklasse...
Wenn ich hier richtig liege, was spricht gegen typeof(T).FullName (wenn du nicht grade alle paar Wochen deine Klassen/Namespaces umbenennst)?

Rabban Themenstarter:in
106 Beiträge seit 2011
vor 12 Jahren

Die Idee dahinter ist, das die Klasse Search eine Datenbanksuche darstellen soll. Search holt sich von T.getString() (in dem fall würde es nicht getString sondern TableName heissen) den Tabellennamen und baut sich daraus einen SQL Select befehl, der nichts weiter tun soll, als die PrimaryKeys zurückzugeben. Anschliessend wollte ich über die PrimaryKeys die Instanzen von T erstellen. Damit ich abschliessend ein Array von T habe.


T obj = new T();
obj.load(primaryKey);

Wenn ich hier richtig liege, was spricht gegen typeof(T).FullName (wenn du nicht grade alle paar Wochen deine Klassen/Namespaces umbenennst)?

Die namen würde sich zwar nicht ändern, aber dann müsste Search den Tabellennamen von jeder Klasse wissen. Und das wollte ich ja eigentlich vermeiden.

107 Beiträge seit 2011
vor 12 Jahren

Du könntest auch einfach eine abstrakte Methode/Property verwenden.

Ansonsten bitte auch das berücksichtigen: Mapper

q.e.d.

Rabban Themenstarter:in
106 Beiträge seit 2011
vor 12 Jahren

Du könntest auch einfach eine abstrakte Methode/Property verwenden.

Kann ich leider nicht, da eine abstrakte Methode an eine Instanz gebunden ist, sie sollte aber statisch sein.

Ansonsten bitte auch das berücksichtigen: Mapper

der Begriff O/R-Mapper ist mir neu, da werd ich mich wohl erstmal reinlesen müssen.
Fowler hat mehrere Bücher geschrieben, welche davon meinst du?

MfG
Rabban

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Rabban,

Fowler hat mehrere Bücher geschrieben, welche davon meinst du?

Hier ist das "Patterns of Enterprise Application Architecture" gemeint.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Rabban Themenstarter:in
106 Beiträge seit 2011
vor 12 Jahren

Danke für eure Hilfe, jetzt hab ich wenigstens einen Ansatzpunkt mit dem ich weiterarbeiten kann 😉

MfG
Rabban