Laden...

Vererbung von Klassen: Problem beim Konstruktor

Erstellt von Sutix vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.650 Views
Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren
Vererbung von Klassen: Problem beim Konstruktor

Hallo Leute,

ich habe ein Problem beim Konstruktor. Ich zeige am Besten eben die Struktur:

Basisklasse:


public class BscUserControl : System.Windows.Forms.UserControl{public BscUserControl(ref DispatchAbles.Dispatchable MyParentDispatcher)
{
[...]
this.ParentDispatcher = MyParentDispatcher;
}
}

Abgeleitete Klasse:


public partial class WizIntro : SystemAnalysator.Klassen.Mainclasses.BscUserControl
{
public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher)
{

}
}

Dort wird schon gemeckert:

Fehler 4 "SystemAnalysator.Klassen.Mainclasses.BscUserControl" enthält keinen Konstruktor, der 0-Argumente akzeptiert. ***\Klassen\BscForm\WizIntro.cs 19 10 ***

Beim instanzieren gibts natürlich das gleiche Problem. Ich weiß leider nicht wo genau nun das Problem liegt. Den Konstruktor in der Basisklasse brauche ich aber unbedingt, da dort Funktionalitäten bereitgestellt werden, die ich in allen abgeleiteten Klassen benötige. Leider weiß ich nicht genau wonach ich hier suchen müsste. Das Prinzip der Vererbung habe ich eigentlich verstanden und hatte bisher auch nie ein Problem damit. Wenn ich den Konstruktor in der abgeleiteten Klasse weglasse funktioniert es auch nicht.

Ich hoffe auf hilfreiche Antworten.

Sutix

D
500 Beiträge seit 2007
vor 14 Jahren

Hi!

Dir fehlt das Schlusselwort "base".


public partial class WizIntro : SystemAnalysator.Klassen.Mainclasses.BscUserControl
{
public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher)
: base(MyParentDispatcher)
{

}
}

Ob Du nun wirklich "ref" benoetigst, sei mal dahingestellt. Habe ich hier an der Stelle nicht beachtet.

Gruss, DaMoe

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

So doof es klingt, dass habe ich schon ausprobiert... Nur bin ich scheinbar zu doof. Es ist ja eine Referenz, ich hab bei base() das ref vergessen. So ists richtig:

public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher): base(ref MyParentDispatcher)
2.891 Beiträge seit 2004
vor 14 Jahren
Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

Hi nochmal.

Ich bekomme hier die Kriese... Nachdem das Vererbungsproblem gelöst werden konnte kam es zu einem neuen. Ich kann keine Instanzen des Usercontrols erstellen. Ich bekomme im Designer die Fehlermeldung, dass der Konstruktor der Vaterklasse nicht gefunden werden kann. Hat jemand eine Idee? Der gleiche Code wie oben nur jetzt eine Instanz davon...


Mainclasses.DispatchAbles.CollectScreenDispatcher MyParentDispatcher = new Mainclasses.DispatchAbles.CollectScreenDispatcher();

WizIntro NewControl = new WizIntro(ref MyParentDispatcher);

5.299 Beiträge seit 2008
vor 14 Jahren

Der Designer braucht einen parameterlossen Konstruktor, damitter was aufs Form schmeißen kann.

Der frühe Apfel fängt den Wurm.

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

EDIT: Hat sich erledigt, Tippfehler, woher auch immer der kam...

Hallo Leute. Es ist schrecklich. Ich habe nichts geändert. Das Programm ließ sich gestern noch kompilieren und nachdem der Fehler mit dem Designer war nicht mehr. beim Instanzieren des UserControls BscUserControl bekomme ich im Constructor die Fehlermeldung, dass er etwas zurückliefern muss. Ich muss irgendwo einen schrecklichen Fehler gemacht haben, denn irgendwie funktioniert einfach mal gar nichts mehr...

In der Hoffnung, dass irgendjemand eine Idee hat. Ich mache in der Datei eigentlich nichts spektakuläres.



public class BscUserConstrol : System.Windows.Forms.UserControl
{
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt(IntPtr hdcDest, int xDest, int yDest, int width, int height, IntPtr hdcSrc, int xSrc, int ySrc, int dwRop);

public paintObj[] paintObjects;
[...]

private DispatchAbles.Dispatchable ParentDispatcher;
public BscUserControl()
{
InitializeComponent();
}

public BscUserControl(ref DispatchAbles.Dispatchable MyParentDispatcher)
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.DoubleBuffered = true;
testmap = new Bitmap(this.Width, this.Height);
this.IdleTimer = new Timer();
this.IdleTimer.Interval = 50;
this.IdleTimer.Tick += new EventHandler(IdleTimer_Tick);
this.ParentDispatcher = MyParentDispatcher;
}
}

5.658 Beiträge seit 2006
vor 14 Jahren

Die Antwort hat doch der ErfinderDesRades oben schon gegeben, oder? Hast du das mal ausprobiert?

Weeks of programming can save you hours of planning

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

Es hatte einen anderen Grund. Irgendwie hatte sich ein Tippfehler eingeschlichen... Wie auch immer. Ich denke ich sollte das Projekt einfach trashen, denn langsam verliere ich die Lust daran, da sobald ich einen Fehler behebe im gleichen Moment ein neuer auftaucht und vorher noch alles funktionierte. Ich fühle mich sowas von verarscht...

Ist es nicht möglich, wenn ich folgende Struktur habe:

Object
GeerbtesObject : Object

das ich einen Konstruktor habe, der so aussieht:

public myclass(ref Object)

und dann eine Instanz von GeerbtesObject als Referenz übergebe?

5.658 Beiträge seit 2006
vor 14 Jahren

Ich fühle mich sowas von verarscht...

Weil du Rechtschreibefehler machst?

Offensichtlich fehlen dir hier die Grundlagen, sonst könntest du dir die letzte Frage auch selbst beantworten. Das sind absolute Basics, und die werden hier vorausgesetzt: [Hinweis] Wie poste ich richtig?

Bitte geh in dich und belies dich hier :rtfm:, hier 🛈 und hier 📗

Btw. wurde der (Un)sinn des ref-Schlüsselwortes in diesem Zusammenhang schon weiter oben erwähnt.

Christian

Weeks of programming can save you hours of planning

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

Hallo,

mir fehlen mit absoluter Sicherheit nicht die Basics. Und entschuldige, aber welchen Sinn sollte deine Antwort erfüllen? Ich weiß wie ich Google bediene und ich habe auch in der Referenz nachgesehen. Also behandel mich hier nicht so von oben herab. Ich bin einfach ein bisschen genervt, weil eine solch simple Sache nicht funktioniert. Es kann sein, dass ich in einigen Dingen nicht mehr so ganz drin stecke, aber ich habe mir alle Grundlagen angeeignet. In der Referenz zu ref steht nichts über geerbte Klassen. So viel dazu...

Also vielen Dank für die Antwort, auch wenn sie mir kein bisschen weitergeholfen hat.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Sutix,

ich verstehe nicht ganz, wo dein (momentanes) Problem liegt.

Denn wie ErfinderDesRades schon geschrieben hat, brauchen UserControls unbedingt einen parameterlosen Konstruktor, damit sie im Designer verwendet werden können. Das Problem sehe ich also als gelöst an.
Und deine Frage bzg. der Übergabe einer Referenz lässt sich durch Ausprobieren auch leicht lösen:

public class A { }

public class B : A
{
	public B(ref A a)
	{ }
}

... funktioniert einwandfrei.

Gruß,
dN!3L

63 Beiträge seit 2007
vor 14 Jahren

Und ich frage mich wozu du in einem geerbten Objekt noch eine Referenz auf das Base.Objekt brauchst, schliesslich hast du es über base. ja schon ?

2.891 Beiträge seit 2004
vor 14 Jahren

Und ich frage mich wozu du in einem geerbten Objekt noch eine Referenz auf das Base.Objekt brauchst, schliesslich hast du es über base. ja schon ?

Nein, das ist nicht das gleiche. Das als Referenz übergebene Objekt hat nur den Typ der Generalisierung, es ist aber ein anderes Exemplar.

Gruß,
dN!3L

63 Beiträge seit 2007
vor 14 Jahren

Schon klar, trotzdem ist der Sinn bei Vererbung mit Referenz auf die Basis irgendwie nicht ganz klar ...

63 Beiträge seit 2007
vor 14 Jahren

Ist es dann eine Ist-Ein oder Ist-Ein-Hat-Aber-Auch-Ein ? 😃

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo vandango,

Ist es dann eine Ist-Ein oder Ist-Ein-Hat-Aber-Auch-Ein ? 😃

Es ist ganz normal ein "ist-ein". Denn es wird ja erstmal nur ein Parameter übergeben, weshalb es erstmal auch überhaupt keine "hat-ein" ist.

Schon klar, trotzdem ist der Sinn bei Vererbung mit Referenz auf die Basis irgendwie nicht ganz klar... Das mit dem ref ist etwas ungewöhnlich (benutze ich eigentlich nie), aber das übergeben eines Exemplars der Basisklasse im Konstruktor macht z.B. bei Konvertierungen durchaus Sinn (damit man die Felder kopieren kann).

Gruß,
dN!3L

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

Hi ehrlichgesagt verstehe ich es auch nicht. Und ich ging auch nicht davon aus, dass es nicht klappt. Deshalb bin ich auch nicht grad gut gelaunt. Den parameterlosen Konstruktor habe ich schon eine ganze Weile drin, das ändert aber gar nichts an der Sache. Nochmal alle involvierten Klassen:

Das ref bezieht sich nicht auf base, was auch sinnlos wäre, da es davon nie eine Instanz gibt, es bezieht sich auf die Klasse, die das Objekt beinhaltet. Aber der Grund, WIESO ich ref benutze ist auch völlig irrelevant. Es soll einfach eine direkte Beziehung zur Klasse herstellen, die den Dispatcher beinhaltet. Es gibt eventuell andere gute Lösungen dafür, aber in c++ würde ich einen pointer übergeben.

Nochmal: Das Objekt, dass per ref übergeben wird ist eine ganz andere Klasse als die, bei der es im Konstruktor übergeben wird!

Problemform


namespace SystemAnalysator.Klassen.BscForm
{
public partial class WizIntro : SystemAnalysator.Klassen.Mainclasses.BscUserControl
{
public WizIntro()
{
InitializeComponent();
}

public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher)
: base(ref MyParentDispatcher)
{
InitializeComponent();
}
}
}


Dispatchklassen


namespace SystemAnalysator.Klassen.Mainclasses.DispatchAbles
{
public abstract class Dispatchable
{
[... Unwichtig ...]
}
}

namespace SystemAnalysator.Klassen.Mainclasses.DispatchAbles
{
class CollectScreenDispatcher : Dispatchable
{
[... Auch nichts wichtiges bisher...]

}
}

Basisklasse meiner Usercontrols


namespace SystemAnalysator.Klassen.Mainclasses
{
public struct paintObj
{
public Image ctrImage;
public int ctrLeft;
public int ctrTop;
}

public class BscUserControl : System.Windows.Forms.UserControl
{

[System.Runtime.InteropServices.DllImport("gdi32.dll";)]
public static extern long BitBlt(IntPtr hdcDest, int xDest, int yDest, int width, int height, IntPtr hdcSrc, int xSrc, int ySrc, int dwRop);

public paintObj[] paintObjects;

Bitmap testmap;
private bool _isDisabled = false;
public bool isDisabled
{
private DispatchAbles.Dispatchable ParentDispatcher;

public BscUserControl()
{
InitializeComponent();
}

public BscUserControl(ref DispatchAbles.Dispatchable MyParentDispatcher)
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.DoubleBuffered = true;
testmap = new Bitmap(this.Width, this.Height);
this.IdleTimer = new Timer();
this.IdleTimer.Interval = 50;
this.IdleTimer.Tick += new EventHandler(IdleTimer_Tick);

this.ParentDispatcher = MyParentDispatcher;
}
}
}

Initialisierung


SystemAnalysator.Klassen.Mainclasses.DispatchAbles.CollectScreenDispatcher MyParentDispatcher = new SystemAnalysator.Klassen.Mainclasses.DispatchAbles.CollectScreenDispatcher();
SystemAnalysator.Klassen.BscForm.WizIntro NewControl = new WizIntro(ref MyParentDispatcher);

2.891 Beiträge seit 2004
vor 14 Jahren

Nochmal: Was ist das Problem?

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

Warnung 1 Der Designer konnte für diese Datei nicht angezeigt werden, da keine der enthaltenen Klassen definiert werden kann. Der Designer hat folgende Klassen in der Datei überprüft: WizIntro -- Die SystemAnalysator.Klassen.Mainclasses.BscUserControl-Basisklasse konnte nicht geladen werden. Stellen Sie sicher, dass auf die Assembly verwiesen wurde und alle Projekte erstellt wurden.

Fehler 2 Die beste Übereinstimmung für die überladene SystemAnalysator.Klassen.BscForm.WizIntro.WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable)-Methode hat einige ungültige Argumente. ***r\Klassen\BscForm\WizzardForm.cs

Fehler 3 1-Argument: kann nicht von "ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.CollectScreenDispatcher" in "ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable" konvertiert werden.

Ich kann keine Instanz der Klasse WizIntro erstellen, da er nicht von CollectScreenDispatcher zu Dispatchable konvertieren kann.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Sutix,

sind das alle Fehlermeldungen, die du bekommst? Denn CollectScreenDispatcher ist laut deinen Codeauszügen ja ein Dispatchable. Sieht für mich eher wie "Sekundärfehler" aus.

Gruß,
dN!3L

Sutix Themenstarter:in
83 Beiträge seit 2006
vor 14 Jahren

Ja, das sind wirklich alle Fehler die ich bekomme. Ich verstehe es auch absolut nicht. Ja, es ist von Dispatchable geerbt, also sollte es da eigentlich kein Problem geben. Einen versteckten Fehler kann ich nicht ausschließen, aber es ist unwahrscheinlich, da diese Fehler erst auftreten, seitdem ich die Klassen Dispatchable und CollectScreenDispatcher erstellt und in den Konstruktor hinzugefügt habe 😦

Ich bin absolut ratlos.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Sutix,

siehe [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) und [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Außerdem kommt es nicht gut an, wenn du deine schlechte Laune hier so raushängen lässt. Für die können wir ja nichts.

herbivore