In C# enthalten Variablen technisch gesehen tatsächlich nur Zeiger (Speicheradressen, besser: Referenzen) auf Objekte und dessen sollte man sich auch immer bewusst sein, aber es ist verwirrend und auch sonst nicht sinnvoll von Zeigern zu sprechen, denn neben den üblichen Referenzvariablen gibt es in C# auch explizit Zeiger/Zeigervariablen. Man sollte besser von Referenzen oder Verweisen sprechen bzw. davon, dass eine Variable auf ein Objekt referenziert oder verweist.
Hallo Leute,
ich frage mich, ob folgendes möglich ist:
An eine Methode übergebe ich ein Objekt mittels eines Zeigers, der nicht vom Typ des Objekts selbst ist, sondern von einem Typ in der Vererbungshierarchie des Objekts weiter oben. Soweit kein Problem.
Nun würde ich gerne mit Hilfe dieses Zeigers eine Eigenschaft des Objekts ändern, wobei es diese Eigenschaft aber nur in dem Objekt selbst gibt, nicht aber in der Hierarchie-Ebene, aus der der Zeiger stammt.
Beispiel:
Die Klasse des Objekts könnte dabei so aussehen:
class Zwei : Eins
{
public double EigenschaftAusZwei
{...}
}
Man hat nun einen Zeiger vom Typ "Eins", der auf ein Objekt des Klasse "Zwei" zeigt:
Eins Zeiger = new Zwei();
Und über "Zeiger" möchte ich nun irgendwie auf "EigenschaftAusZwei" zugreifen. Geht das?
Zeiger.EigenschaftAusZwei = 10; // so geht's leider nicht
Danke für eure Ideen und viele Grüße
Thomas
Hallo OldSchoolGuy,
ja, du musst casten,dann gehts:
Eins Zeiger = new Zwei();
((Zwei)Zeiger ).EigenschaftAusZwei = 5;
Wobei dies in diesem Zusammenhang fehleranfällig ist. Warum siehst du hier:
public void Test()
{
Foo(new Drei());
}
public void Foo(Eins e)
{
((Zwei)Zeiger ).EigenschaftAusZwei = 5;
}
class Drei : Eins
{}
Gruß
Michael
Hallo Floste, hallo Michael,
vielen Dank für eure Antworten!
Angenommen, ich weiß während der Laufzeit nicht, welchem Typ "Zeiger" entspricht, weil mehrere Klasse von "Eins" erben, so wie Michael das auch gezeigt hat. Alle diese erbenden Klassen enthalten dieselbe Eigenschaft, der ich einen Wert zuweisen möchte:
class Zwei : Eins
{
public double TestEigenschaft
{}
}
class Drei : Eins
{
public double TestEigenschaft
{}
}
Nun habe ich den "Zeiger", weiß aber nicht, ob er auf ein Objekt der Klasse "Zwei" oder "Drei" zeigt. Wie sähe dann die Syntax aus?
((???)Zeiger).TestEigenschaft = 10; // was setzt man hier statt "???" ein?
Danke & Gruß
Thomas
Hallo OldSchoolGuy,
Alle diese erbenden Klassen enthalten dieselbe Eigenschaft, der ich einen Wert zuweisen möchte:
in diesem Fall gehört die Eigenschaft in die Basisklasse, von der alle Klassen erben — dies ist schließlich deren gemeinsame Schnittstelle.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Grundsätzlich sollten ableitende Klassen die Basisklasse erweitern. Dies machst du auch, aber du erstellst in allen ableitenden Klassen die Eigenschaft neu. Bei einzelnen Membern ohne Logik mag das zwar nicht problematisch sein, aber das Problem bekommst du dann falls sich ein Member irgendwann am Namen bzw Logik ändern, dann "darst" du alle anderen Klassen nach ähnlichem durchsehen. Dies ist nicht saubere OOP. Wie m0rius bereits sagte werden alle gemeinsamen Member der Subklassen in die Baseklasse "geschubst"
Hallo m0rius und Michael,
danke für eure Antworten und eure Geduld.
Ich werde die Eigenschaft in die Basisklasse schreiben.
Viele Grüße
Thomas