Laden...

[gelöst] Eigene GUI-Control-Oberklasse

Erstellt von lupus vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.212 Views
L
lupus Themenstarter:in
37 Beiträge seit 2005
vor 14 Jahren
[gelöst] Eigene GUI-Control-Oberklasse

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

49.485 Beiträge seit 2005
vor 14 Jahren

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

L
lupus Themenstarter:in
37 Beiträge seit 2005
vor 14 Jahren

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

S
21 Beiträge seit 2009
vor 14 Jahren

könnte man das nicht mit erweiterunsmethoden einfacher handhaben?

5.941 Beiträge seit 2005
vor 14 Jahren

Hallo 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