canlot hat geschrieben:Hallo ich habe eine Frage und zwar ist es in C# möglich einen von allen Datentypen verwendetet Datentypen zu verwenden.
beides funktioniert in c#.
Diese "Technik" nennt sich Boxing und entspricht mehr oder weniger - wie schon geschrieben - dem Void-Pointer. Da alles von object erbt, C# vorrangig mit Referenzen arbeitet, könntest Du alle Deine Objekte, die Du listen möchtest von einer class Object erben lassen.
Code: Alles auswählen
class Object
{
public:
virtual ~Object(); // <- wichtig!
};
class Double : public Object
{
double Value;
public:
Double( double value ) : Value( value ) {}
};
Das ist in C# grundsätzlich gegeben und damit ein Unterschied zu C++, den Du in C++ ausformulieren musst.
canlot hat geschrieben:Was ich aber eher bezwecken möchte:
Code: Alles auswählen
List<objekt> variablen = new List<objekt>();
variablen.Add("Erste");
variablen.Add(2);
Wie kann ich das gleiche in C++ realisieren?
Nun kannst Du hingehen und Deine Liste konstruieren:
Code: Alles auswählen
class ObjectList
{
std::list< Object * > Elements;
public:
void Add( char const * value ) { Elements.Add( new String( value ) ); }
void Add( Double * value ) { Elements.Add( new Double( value ) ); }
void Add( Integer * value ) { Elements.Add( new Integer( value ) ); }
...
};
Obwohl Du in C++ mehr schreiben musst, halte ich die C++ Variante für besser. In die C#-Liste kannst Du vom Integer zum GUI-Fenster zur Datenbankverbindung alles reinpacken. Mit Typsicherheit hast Du dann nichts mehr am Hut, weil nunmal absolut alles von 'object' abgeleitet ist. Bei C++ musst Du wenigstens sagen, welche Typen Du von Object ableiten willst, Du hast also wenigstens schonmal eine Auswahl von Möglichkeiten getroffen.
Bitte beachte, dass Die Object-List damit auch verantwortlich ist, die Objekte freizugeben. Es ist also zu überlegen statt
lieber
zu nehmen.
Dein Objekt sollte das gemeinsame Interface abbilden. Also die Mindestqualifikation aller aufgelisteten Objekte. Das tut "object" in C# eben nicht. Du musst dann abfragen, um welches Object es sich handelt ( if( var is string ) ... ), was vollkommen gegenläufig zur Idee läuft, Elemente zu klassifizieren, um damit objektorientiert zu arbeiten. Das ist eher ein alter C-Stil.
Hier finden sich void-Pointer und 'object' in ihrer größten Gemeinsamkeit: Man sollte beides nicht nutzen. Auch in C# solltest Du alle aufgelisteten Objekte von einem gemeinsamen Interface ableiten und sollten sie kein gemeinsames Inteface besitzen, dann solltest Du Dich fragen, warum Du sie gemeinsam listest.