Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[gelöst] Eigene GUI-Control-Oberklasse
lupus
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

[gelöst] Eigene GUI-Control-Oberklasse

beantworten | zitieren | melden

Moin,
ich bin auf der Suche GUI-Controls möglichst schön und zugänglich zu programmieren. Dabei soll es eine Oberklasse bsp. AbstractControl geben, welche Dinge speichert, die jede Control benötigt.

Beispiel:


public abstract class AbstrcatControl {
   private string id;
   
   public string ID {
      get { return this.id; }
   } 
}

Davon sollen alle Controls wie TextBox, ComboBox etc. ableiten. Dies geht natürlich nicht, wenn man die Standard-Komponenten nutzen will, da mehrfach Vererbung nicht möglich ist. Folgendes geht also nicht:


public class MyTextBox : TextBox, AbstrcatControl {
}

Dies wäre aber die schönste und gesuchte Lösung. Nun habe ich mir zwei Möglichkeiten überlegt mit denen man das gewünschte Ergebnis bekommen könnte. Allerdings finde ich beide unschön.

Version 1:
Man regelt das ganze über ein OberInterface:


public interface IControl {  
   public string ID {
      get;
   } 
}

public class MyTextBox : TextBox, IControl {
   private string id;
   
   public string ID {
      get { return this.id; }
   } 
}

Positiv ist hierbei, dass man im Interface festlegen kann, was die implementierenden Klassen können (ein Interface halt ;)). Leider kann durch diese Architektur ein enormer Wartungsaufwand entstehen. Möchte man nun einen neue Eigenschaft einführen bzw. entfernen muss man alle Klassen wie Textbox, Combobox etc anfassen.

Version 2:
Hier kann man versuchen, die eigentlichen Controls zu verstecken:


public abstract class AbstractControl : Control {
   private Control myControl;
 
   private string id;
   
   public string ID {
      get { return this.id; }
   }

   protected registerControl(Control myControl) {
      this.myControl = myControl;
   }
}

public class MyTextBox : AbstractControl {
   private TextBox innerTextBox = new TextBox();

   public MyTextBox () {
     registerControl(innerTextBox ) 
   }
}

So kann man abstrakte Container erstellen, welche zur not auch mehrere Controls enthalten. Diese Container bündeln auch alle Eigenschaften als Oberklasse. Eigentlich eine rechte gute Version. Nur gibt es hier auch ein schwerwiegendes Problem. Möchte man nun Eigenschaften der innerTextBox ändern kann man das nicht über den Designer machen. D. h. man ändert nur die Eigenschaften der MyTextBox (bspw. Hintergrundfarbe). Man müsste also alle Eingaben, Events und Methoden der MyTextBox an die innerTextBox weiterleiten. Dies könnte auch in der AbstractControl geschehen. Dabei könnte man sogar alle Eigenschaften, welche nicht genutzt werden sollen private setzen. So kann man Controls erstellen, welche nur nach den eigenen Wünschen verändert werden können. Allerdings ist dies mit einem riesen Aufwand verbunden.

Wie man vielleicht schon gemerkt hat, gefallen mir beide Lösungen nicht. Hat vielleicht jemand eine tolle Idee. Ich habe bestimmt wieder ein Brett vor dem Kopf und es gibt eine offensichtliche schöne Lösung.

Grüße
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von lupus am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo lupus,

eine so elegante Lösung wie man sie mit Mehrfachvererbung erreichen würde, gibt es in C# leider nicht.

Ich würde klar Lösung 1 verwenden und zusätzlich eine Hilfsklasse schreiben, die die Implementierung des Interfaces erleichtert. Im einfachsten Fall muss dann zur Implementierung jeder Methode des Interfaces nur die korrespondierende Methode der Hilfsklasse aufgerufen werden. Das reduziert den Wartungsaufwand, auch wenn es ihn nicht ganz verhindert.

herbivore
private Nachricht | Beiträge des Benutzers
lupus
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,
danke schon mal. Sowas habe ich mir schon gedacht. Mit einer Hilfsklasse meinst du vermutliche eine, die Methoden usw., welche von vielen Controls benötigt werden, bündelt.

Grüße
private Nachricht | Beiträge des Benutzers
Sekkiy
myCSharp.de - Member



Dabei seit:
Beiträge: 21

beantworten | zitieren | melden

könnte man das nicht mit erweiterunsmethoden einfacher handhaben?
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo Sekkiy
Zitat von Sekkiy
könnte man das nicht mit erweiterunsmethoden einfacher handhaben?
Wenn du eine Methode hast, die bspw. für alle Control-Basisklassen sinnvoll genutzt werden kann, ja.

Allerdings hast du nur Zugriff auf die öffentlichen Member.
Wenn du die Lösung von herbivore nutzt, kannst du bis auf protected runter.


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers