Entwickler-Ecke

Basistechnologien - Generische Basisklasse -> Spezifische Unterklasse?


shamanu - Mi 16.09.09 17:58
Titel: Generische Basisklasse -> Spezifische Unterklasse?
Aktueller Stand:
A = Basisklasse
B = Mehrere von A abgeleitete Klassen

In B sind jedoch noch Funktionalitäten enthalten welche bei allen gleich sind.

Das Problem basiert auf den Membern:
B1 hat mehrere Listen welche von den Typen immer folgendermaßen aufgebaut sind IList<KeyValuePair<string, int>>
B2 hat mehrere Listen welche von den Typen immer folgendermaßen aufgebaut sind IList<KeyValuePair<string, bool>>
B3 hat mehrere Listen welche von den Typen immer folgendermaßen aufgebaut sind IList<KeyValuePair<string, xxx>>
...
auf diesen werden teilweise die gleichen Opterationen ausgeführt. Den Teil welcher gleich ist würde ich gerne nach A auslagern.

Gibt es für das Auslagern eine elegante Lösung?
Wenn ich den typ object nehme (anstatt int, bool usw) wäre jederzeit ein casting + Un/Boxing notwendig und die Typsicherheit geht verloren.
Die Basisklasse müßte also generisch auf den Listen arbeiten können während die abgeleitete Klasse trotzdem direkt darauf zugreifen kann.


Christian S. - Mi 16.09.09 18:21

Hallo!

Meinst Du sowas?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            var b = new B();
            b.Add("foo"4);
        }
    }


    class B : A<int> { }


    class A<T>
    {
        private List<KeyValuePair<string, T>> l;

        public A()
        {
            l = new List<KeyValuePair<string, T>>();
        }

        public void Add(string name, T stuff)
        {
            l.Add(new KeyValuePair<string, T>(name, stuff));
        }
    }
}


Grüße
Christian


shamanu - Mi 16.09.09 18:45

Hi,
so funktioniert das also. Ja, das ist genau was ich gesucht habe.
Ich habe es letzte Woche bereits in diese Richtung probiert wobei meine Herangehensweise offensichtlich an diesem Punkt fehlgeschlagen ist:

C#-Quelltext
1:
class B<int> : A<T> { }                    


Danke für die schnelle Hilfe.