Laden...

Über Referenz der Oberklasse auf Property einer beliebigen Unterklasse zugreifen

Erstellt von OldSchoolGuy vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.831 Views
Thema geschlossen
O
OldSchoolGuy Themenstarter:in
9 Beiträge seit 2011
vor 13 Jahren
Hinweis von herbivore vor 13 Jahren

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.

Über Referenz der Oberklasse auf Property einer beliebigen Unterklasse zugreifen

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

1.130 Beiträge seit 2007
vor 13 Jahren
((Zwei)Zeiger).EigenschaftAusZwei = 10; // so geht's

Sowas nennt sich auch casting.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

1.552 Beiträge seit 2010
vor 13 Jahren

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

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

O
OldSchoolGuy Themenstarter:in
9 Beiträge seit 2011
vor 13 Jahren

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

1.002 Beiträge seit 2007
vor 13 Jahren

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

1.552 Beiträge seit 2010
vor 13 Jahren

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"

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

O
OldSchoolGuy Themenstarter:in
9 Beiträge seit 2011
vor 13 Jahren

Hallo m0rius und Michael,

danke für eure Antworten und eure Geduld.

Ich werde die Eigenschaft in die Basisklasse schreiben.

Viele Grüße
Thomas

Thema geschlossen