Laden...

Klasse anhand übergebener Parameter instanzieren [==> Generics]

Erstellt von padde77 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.895 Views
Thema geschlossen
P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 11 Jahren
Klasse anhand übergebener Parameter instanzieren [==> Generics]

Hi,

ist es möglich, dass ich eine Klasse mit new instanziere, welche als Namen den Parameter eines Aufrufs hat.

Beispiel:

rechne(addiere,1,4)

public string rechne (??? typ, int zahl1, int zahl2){

statt:

if (typ == "addiere"){
addiere calc = new addiere();
}

hätte ich gerne sowas:

typ calc = new typ();

}

Sonst werden die if´s immer länger.

Geht sowas?

Vielen Dank
Padde

2.207 Beiträge seit 2011
vor 11 Jahren

Hallo padde77,

wieso machst du nicht eine Rechne-Klasse und machst die Methode "Addieren" von aussen erreichbar?

Dann hast du


Rechne rechne = new Rechne();
int ergebnis = rechne.addieren(1,4);

Ist das das, was du willst?

Gruss

Coffeebean

P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 11 Jahren

Hi nochmal,

nein, das möchte ich genau vermeiden, da die Klassen "universal" sein sollen, also jeder 1. Parameter von rechne() soll eine entsprechende Klasse instanzieren.

Danke padde

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo padde77,

machs generisch mit der Typeinschränkung new(), dann kannst du schreiben:


public string Rechne<T> (int zahl1, int zahl2) where T : new()
{
    T calc = new T();
}

Sonst könntest du dir Dependency-Injection, das Strategie-Muster anschauen od. einen Delegaten übergeben.

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!"

P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 11 Jahren

Hi gfoidl,

da sieht nicht schlecht aus, da versuch ich mal.
Nur mit den Delegates steig ich noch nicht so durch...

Danke, ich melde mich wieder.

Padde

1.346 Beiträge seit 2008
vor 11 Jahren

Wie wäre es mit einfachen Generics?

    class Program
    {
        static void Main(string[] args)
        {
            double d1 = 10.0, d2 = 15.0;

            double result1 = Rechner.Rechne<Addierer>(d1, d2); // 25
            double result2 = Rechner.Rechne<Subtrahierer>(d1, d2); // -5
        }
    }

    public static class Rechner
    {
        public static double Rechne<T>(double input1, double input2) where T : IRechner, new()
        {
            T rechner = new T();

            return rechner.Rechne(input1, input2);
        }
    }

    public interface IRechner
    {
        double Rechne(double input1, double input2);
    }

    public class Addierer : IRechner
    {
        public double Rechne(double input1, double input2)
        {
            return input1 + input2;
        }
    }

    public class Subtrahierer : IRechner
    {
        public double Rechne(double input1, double input2)
        {
            return input1 - input2;
        }
    }
P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 11 Jahren

Hi nochmal,

also, ich habs wie gfoidl erstellt, klappt.

Rechne<T> (int zahl1, int zahl2);

T kommt allerdings aus einem Menüaufruf, welchen ich mit
e.Item.Name
abfrage.
e.Item.Name = addiere;

nur kennt VS das e.Item.Name nicht.
Gibt es einen Aufruf in der Art:
Rechne<e.Item.Name as IRGENDWAS> (int zahl1, int zahl2);
oder ähnliches?

Danke
padde

16.806 Beiträge seit 2008
vor 11 Jahren

Wir rutschen solangsam in die Richtung der Grundlagen von C#
Siehe auch [Hinweis] Wie poste ich richtig? 1.1 und 1.1.1

Natürlich kannst Du aus einem Menü entsprechend Casten oder Mappen.
Auf dem Präsentierteller wird Dir aber auch VS nicht alles anbieten - ein wenig denken und nachschauen musst dann schon auch selbst.

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo padde77,

dazu hast du mehrere Möglichkeiten:

  1. du erstellst ein Mapping mit einem Dictionary<string, IRechner> und liest dann von dort den IRechner aus (vom pdelvos Beispiel)

  2. du holst dir mittels Type.GetType aus dem String den Typ und erstellst dann mittels Activator.CreateInstance das Objekt und castest es auf IRechner
    Also eine Factory, die das Erstellen übernimmt.

  3. ...

Ich würde erstere Möglichkeit nehmen.

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!"

P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 11 Jahren

OK,

ich werde es mal versuchen.

Vielen Dank!

Thema geschlossen