Frage von Jonny1000, 42

Programmierung C# Zugriff auf Attribute bei Vererbung?

Hallo Leute,

ich habe folgendes Problem. Ich habe eine Form erstellt. Dies ist der Ahne (Form1). Davon habe ich mehrere Erben (Form2, Form3,...) erstellt. Die Funktionalitäten habe ich in eine Klasse ausgelagert.

Ich will nun von der Klasse auf alle Fenster zugreifen können. Deshalb dachte ich mir das ich die Klasse im Konstruktor des Ahnen (Form1) instanziiere und auch an dem Ort die Instanz des Ahnen der Klasse übergebe. Ich hatte mir damit erhofft nun in der Klasse über die zuvor übergebene Instanz auch auf alle Attribute der Erben (Form2, Form3,...) zugreifen zu können (z. B. Instanzvariablen). Dies funktioniert allerdings nicht, weil in der übergebenen Instanz ja nur die Attribute des Ahnen enthalten sind.

Wie schaffe ich es jetzt von der Klasse auch auf alle Attribute der Erben (Form2, Form3,...) zugreifen zu können, ohne die Klasse bei den Erben neu instanziieren zu müssen?

Gibt es bestenfalls eine Lösung ohne die ganzen Instanzen der Erben der Klasse zu übergeben? Kann man vielleicht einen Typecast nutzen oder doch irgendwie über den Ahnen Zugriff auf die Erben erhalten? Ich weiß echt nicht mehr weiter.

Ich hoffe ihr versteht mein Problem, danke im Voraus Jonny1000

Antwort
von greenvbuser, 15

Es ist in C# nicht möglich, von Ahnen auf Instanzen derer Erben zuzugreifen. Es ist ebenfalls nicht möglich, von Ahnen auf die erbenden Klassen (nicht instanziert) zuzugreifen. Nur die Gegenrichtung is möglich.

Du wirst also einen Work-Around basteln müssen. Hierzu fielen mir spontan Interfaces oder spezielle Methoden ein, die die Instanzen der erbenden Klassen erwarten.

Er wäre nach wie vor hilfreich, wenn du erläutertest, welches Ziel du verfolgst. So können wir besser analysieren, welche Vorgehensweise für dich am ehesten in Frage kommt. 

Kommentar von Jonny1000 ,

Ich habe es aber mal geschafft über die Klasse auf die Erben des Ahnen zuzugreifen indem ich in der Klasse ein Typecast gemacht habe, also:

public class Klasse
{
private Form1 ahne;
private Form2 erbe1;

public Klasse(Form1 instanz)
{
ahne = instanz;

// Hier der Typecast der mir den Zugriff auf die Erben ermöglicht
erbe1 = (Form2)instanz;
}

public void doSomething()
{
erbe1.textBox1.Text = "Hallo Welt";
}
}




Wenn du mir jetzt erklären kannst warum dieser Weg, über eine Variable des Ahnen und einen Typecast auf die Erben des Ahnen zugreifen zu können, dann wäre ich dir echt dankbar.

Ich verstehe nicht warum dieser weg des Casts funktioniert. Ich könnte mir höchstens vorstellen, das das hier funktioniert, wenn ich beim Instanziieren der Klasse nicht den Ahnen (Form1) sondern einen Erben (in diesem Fall Form2) übergeben hätte. Dann hätte der Cast für mich durchaus Sinn ergeben.

Aber hier kann ich scheinbar eine Variable vom Typ des Erbens mit dem gecasteten "Inhalt" der Variable eines Ahnens füllen. Brainfuck.

P.s. Der Sinn davon soll sein einen Hauptahnen zu haben wo z. B. Ereignisse wie das FormClosing Event gefüllt werden sollen. So fragen z. B. alle Erben "ob ich das Fenster wirklich schließen will" usb.

Kommentar von greenvbuser ,

Naja, der Compiler weiß nicht, was sich hinter vererbten Klassen verbirgt. Er weiß nur, dass Form2 zumindest all das hat, was Form1 hat. Damit ist es valide, auf Form2 zu casten. Damit stehen dir alle Methoden und Attribute des Kindes zur Verfügung. Aber spätestens beim tatsächlichen Kompilieren oder allerspätestens beim Ausführen müsste das einen Fehler verursachen, weil Form1 ja nicht WIRKLICH die Methoden, etc, von Form2 hat. Davon abgesehen, würdest du mit diesem Weg auch nie an die Werte der Instanzen kommen... Kannst du das ganze mal auf pastebin stellen? Da ist das besser lesbar und entschlackt zudem den Thread.

Antwort
von triopasi, 24

Wie ist das jetzt? Du hast Form1 und Form2 und Form3 erben von Form1? Oder erben die voneinander?

Und das instanziierst du alles in ner anderen Klasse, richtig? Also nach dem Motto:

Form1 f1 = new Form1();
Form2 f2 = new Form2();
Form3 f3 = new Form3();

Stimmt das? Und auf was willst du dann zugreifen? Sowas geht ja z.B.:

f2.Attribut

Oder möchtest du sozusagen:

f1.Parent.Attribut
Kommentar von Jonny1000 ,

Nee in meinem Ahnen (Form1) instanziiere ich eine Klasse mit allerlei Funktionen. Der Klasse übergebe ich beim Instanziieren im Konstruktor die eigene Instanz sprich:

public partial class Form1 : Form
{
public Klasse klasse;
public Form1()
{
InitializeComponent();
klasse = new Klasse(this);
}
}

Form2 und Form3 erben BEIDE von Form1.

Es sieht da also so:

public partial class Form2 : Form1
{
public string variable = "";
public int variable2 = 0;
public Form2()
{
InitializeComponent();
}
}

und so aus:

public partial class Form3 : Form1
{
public string wert = "";
public int wert2 = 0;
public Form3()
{
InitializeComponent();
}
}

Da ich meiner Klasse bereits die Instanz von Form1 übergeben haben stehen mir da alle Attribute von Form1 zur Verfügung. Allerdings nicht die von Form2 und Form3 (z. B. "variable" oder "wert2").

Ich möchte jetzt von der Klasse aus auf Form2 und Form3 hinzugreifen ohne die Klasse auf beiden Forms neu instanziieren zu müssen.

Kommentar von triopasi ,

Und die Klasse "Klasse" soll über das übergebene Form1 f1 dann auf die Erben von f1 zugreifen  können?

Dann mach doch sowas:

class Form1
{
// engl. "heirs" = Erben
public List<Form1> Heirs = new List<>();
}

und dann

class Form2 : Form1 // genauso in Form3
{
public Form2()
{
base.Heirs.Add(this);
}
}

Also das ist jetzt kein sauberes C# aber es sollte meine Idee ausreichend illustrieren.

Kommentar von Jonny1000 ,

Ja das wäre aufjedenfall schonmal ne Idee. Danke :)

Antwort
von greenvbuser, 18

Warum einfach, wenn es auch umständlich geht...

Ich hab zwar noch nicht zu 100% verstanden, was dein Problem ist. Aber wieso machst du es nicht einfach folgendermaßen:

class Hauptklasse {

public static Form1 frm1 = new Form1();

public static Form2 frm2 = new Form2();

public static Form3 frm3 = new Form3();

}

Jetzt kannst du in den Forms über Hauptklasse.frmX.foo; auf alles zugreifen.
Auch wenn das sicher nicht der beste Weg ist eine robuste Anwendung zu entwickeln. Aber wenn du es unbedingt so haben willst...

Vielleicht erklärst du einfach mal, was du genau vor hast.

Kommentar von Jonny1000 ,

Schau mal im Kommentar über dir, da hab ich nochmal geantwortet ;)


Die Form's sollen halt nicht in der "Hauptklasse" deklariert werden. Es soll lediglich der Zugriff auf bereits erstelle Form's ermöglicht werden. Also ich will in der Hauptklasse zugriff auf alle Fenster haben, indem ich bestenfalls nur die Instanz des Ahnen (Form1) der Hauptklasse übergebe.

Kommentar von greenvbuser ,

Ok, jetzt habe ich dich verstanden, denke ich. Wo genau werden denn Form 2 und 3 instanziert? (Für die generellen Infos siehe meine nächste Antwort.)

Keine passende Antwort gefunden?

Fragen Sie die Community