Laden...

Klasse als Parameter

Erstellt von SvenC vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.505 Views
S
SvenC Themenstarter:in
29 Beiträge seit 2007
vor 15 Jahren
Klasse als Parameter

Hallo,

ich habe folgendes Problem:

beim Klick auf einen Button wird ein kleines Form geöffnet, welches eine ProgressBar und ein Textfeld einthält und eine Instanz der Klasse MeinBericht anlegt.
Im "FormShown"-Event des Forms wird dann die MeinBericht.erstelleBericht()-Methode aufgerufen.

Nun möchte ich mein Form dynamischer machen - es soll für verschiede Berichtstypen funktionieren. Ich gebe dem Kostruktor den Typ mit (MeinBericht1 oder MeinBericht2; alle vom Interface IBericht abgeleitet mit einer Methode erstelleBericht()), und davon soll dann im Kostruktor ein Objekt angelegt werden und im FormShown-Event die erstelleBericht()-Methode aufgerufen werden.

Hier mein bisheriger Stand:

public partial class FormProgress : Form
{
   MeinBericht1 myRep;
     
   public FormProgress()
   {
            wndHandle = this.Handle;
            myRep = new MeinBericht1();

            this.Shown += new EventHandler(FormProgress_Shown);            
   }        

   void FormProgress_Shown(object sender, EventArgs e)
   {                                    
            if (myRep.erstelleBericht(Jahr, ID, wndHandle) == -1)
                MessageBox.Show(repProj.ErrorMessage);

            this.Close();
   }
}

Aufruf über:

FormProgress fp = new FormProgress();
fp.ShowDialog();

Wie bekomme ich das hin? Generics? Delegates?

F
722 Beiträge seit 2005
vor 15 Jahren

du kannst auch einfach einen enum im konstruktor übergeben und basierend darauf deine IBericht Instanz erzeugen. Eine andere Möglichkeit wäre eine generische Methode, dann müssten aufrufende Klassen aber die konkreten Implementierungen kennen. Deshalb würde ich die eunm / Factory variante vorziehen.

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Generics sind genau richtig:


public partial class FormProgress<B> : Forum 
where B : IBericht, new()
{
   public FormProgress()
   {
            wndHandle = this.Handle;
            myRep = new B();
            this.Shown += new EventHandler(FormProgress_Shown);
   }
}


new FormProgress<MeinBericht1>().ShowDialog();
new FormProgress<MeinBericht2>().ShowDialog();

Gruß
Juy Juka

S
SvenC Themenstarter:in
29 Beiträge seit 2007
vor 15 Jahren

Hallo JuyJuka,

Danke für deine Hilfe, so in der Richtung hatte ich mir das vorgestellt.
Allerdings ist mir das ", new()" an dieser Stelle völlig neu! Was hat es denn damit auf sich?

Dieses new() ist sicherlich auch irgendwie dafür verantwortlich, dass ich jetzt in der FormProgress.Designer.cs folgenden Fehler bekomme:

FormProgress.Dispose(bool)": Es wurde keine passende Methode zum Überschreiben gefunden.

R
402 Beiträge seit 2005
vor 15 Jahren

Allerdings ist mir das ", new()" an dieser Stelle völlig neu! Was hat es denn damit auf sich?

diese constraint-angabe,sagt aus,dass die Klasse die fuer B eingesetzt wird über einen parameterlosen konstruktor verfügen muss!

Dieses new() ist sicherlich auch irgendwie dafür verantwortlich, dass ich jetzt in der FormProgress.Designer.cs folgenden Fehler bekomme:
FormProgress.Dispose(bool)": Es wurde keine passende Methode zum Überschreiben gefunden.

nein,dass hat damit nichts zu tun,d.h du hast Dispose(bool) nicht implementiert....

lg rizi

D
500 Beiträge seit 2007
vor 15 Jahren

Dieses new() ist sicherlich auch irgendwie dafür verantwortlich, dass ich jetzt in der FormProgress.Designer.cs folgenden Fehler bekomme:
FormProgress.Dispose(bool)": Es wurde keine passende Methode zum Überschreiben gef

nein,dass hat damit nichts zu tun,d.h du hast Dispose(bool) nicht implementiert....

Ich denke nicht, dass er IDisposable nicht implementiert hat, da meistens der Designer bzw. das VS, wenn man Form Klassen erstellt, dieses Interface implementiert. Ich gehe mal davon aus, dass SvenC eine Umbenennung des Namespaces vorgenommen hat und dies eventuell in der Designer-Klasse vergessen hat. Da es sich dabei um partielle Klassen handelt, kann es nun sein, dass die beiden Teile der Klasse nicht zueinanderfinden, da diese eventuell durch eine Umbenennung in unterschiedlichen Namensräumen sich befinden. Ergo, es wird die Implementierung der Dispose Methode nicht mehr gefunden.

Gruß, DaMoe

R
402 Beiträge seit 2005
vor 15 Jahren

stimmt,das könnte natürlich sein,ich bin davon ausgegangen,dass er die klasse zur testzwecken ohne designer erstellt hat!!

lg rizi

S
SvenC Themenstarter:in
29 Beiträge seit 2007
vor 15 Jahren

... ich musste nur noch in der FormProgress.designer.cs hinter "class FormProgress" das <B> hinzufügen (ich dachte das macht das VS automatisch?) - jetzt funktioniert alles!

Danke nochmal an alle für die Hilfe!

SvenC