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
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
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)
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);
Der Designer braucht einen parameterlossen Konstruktor, damitter was aufs Form schmeißen kann.
Der frühe Apfel fängt den Wurm.
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;
}
}
Die Antwort hat doch der ErfinderDesRades oben schon gegeben, oder? Hast du das mal ausprobiert?
Weeks of programming can save you hours of planning
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?
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
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.
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
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
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
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);
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.
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
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.
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