Zum Inhalt springen

Diskussion:Arbeiten mit .NET: Grundlagen der OOP/ Ein erster Einblick

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Abschnitt hinzufügen
Aus Wikibooks
Letzter Kommentar: vor 14 Jahren von 84.131.151.40 in Abschnitt Felder

Auto statt Sandkuchen

[Bearbeiten]

Wäre es nicht schöner an Stelle des Sandkuchenbeispiels ein Auotbeispiel zu wählen? Ich finde es sehr einfach sich eine abstrakte Klasse vorzustellen, wenn man sagt: Es gibt endlos viele Autos auf der Welt, wir erkennen diese alle als Auto, weil eine abstrakte Vorstellung von Autos im Kopf haben. Diese umfassen alle Eigenschaften blablabla... Wird dann ausformuliert, wenn die Idee gefällt.

Gruß Christian

Ich finde die Sandkuchen sehr anschaulich, weil ja jeder schon mal sandtürmchen gebaut hat! hingegen autos... naja. die presst man nicht so einfach aus einer form. _sophieb

Konstruktor - einen nicht genauer spezifizierten audi erzeugen

[Bearbeiten]

bei mir hat das nicht geklappt. es kam die fehlermeldung: ""Sandkasten.Auto" enthält keinen Konstruktor, der 1-Argumente akzeptiert.". liegt das problem bei mir, oder ist das skript falsch? mfg sophieb

Das kommt darauf an. Das Skript ist in viele Bruchstücke aufgeteilt; vielleicht hast du das Teilchen mit dem Konstruktor "string typ" übersehen oder die Variante kopiert, die vollständig aussieht, aber diesen Konstruktor nicht enthält.
Bitte unterzeichne mit -- ~~~~, dann kommen auch Datum und Uhrzeit automatisch hinzu; das ist für späteres Lesen äußerst nützlich.
Gruß Juetho 09:50, 6. Jan. 2010 (CET)Beantworten
Okay! Jetzt habe ich das Problem verstanden. Nur ist der Text etwas ungenau. Im Text wird der Konstruktor laufend verändert/angepasst. In jedem Code ist immer nur ein Konstruktor zu finden. Dadurch hatte ich den Eindruck, dass man nur einen Konstruktor einbauen kann.
Meiner (Amateur-)Meinung nach müssten entweder mindestens einmal zwei Konstruktoren in einem Code zu finden sein, oder es müsste einmal explizit erwähnt werden.
Gruss Sophieb 16:01, 6. Jan. 2010 (CET)Beantworten
Nicht ganz. Ein Konstruktor, nämlich der ohne Parameter, ist implizit immer vorhanden. Weitere Konstruktoren werden vom Programmierer vorgesehen, wenn es die Arbeit erleichtert; z.B. braucht man für ein konkretes Auto immer Typ und Kennzeichen, also kann man es gleich in einen passenden Konstruktor packen. Problematisch wird es, wenn ein Programmierer (wie der Autor dieses Kapitels) unsauer arbeitet und Sachen weglässt, ohne es zu erwähnen oder zu begründen. Danke übrigens für die Signatur. -- Juetho 16:35, 6. Jan. 2010 (CET)Beantworten

Felder

[Bearbeiten]

Gibt es einen Grund, dass die Felder "m_Nummer" und "m_Farbe" und nicht irgendwie "Auto_Nummer" und "Auto_Farbe" heissen? für mich war es zuerst verwirrend, weil das erste erzeugte Objekt "m_Objekt" hiess. diese "m_"'s haben ja im grunde nichts miteinander zu tun!? mfg sophieb

Der Präfix m_ ist ein Relikt aus der MFC-Zeit und sollte anzeigen, dass das eine Membervariable ist und keine lokale. In C#-Code sollte sowas aber gar nicht nicht mehr auftauchen. Wer so eine Hilfskrücke braucht, hat schlechten Code geschrieben.
Auto_Farbe ist unnötig, denn du bist ja in der Auto-Klasse. Da ist klar, dass damit die Farbe des Autos gemeint ist. Genau das macht die Objektorientiertheit aus. Die Bezeichner für Variablen werden immer klein geschrieben, also m_Farbe müsste einfach farbe lauten. --84.131.151.47 10:40, 6. Jan. 2010 (CET)Beantworten
Man gucke sich nur mal die Methode Blinke() an. Seiten vorher wird lang und breit if/else-if erläutert und dann hier eine stumpfe Aneinanderreihung von ifs mit zudem redundanten Abfragen. sophieb, solltest du C# lernen wollen, kauf lieber ein Buch. Dieses hier wird bei dir noch dermaßen viel Fragen aufwerfen, und ein C#-Forum zur Beantwortung ist das hier nun wirklich nicht. Und dort, wo keine Fragen aufkommen, lernt man schlecht Stil. --84.131.151.47 12:28, 6. Jan. 2010 (CET)Beantworten
Gut! Das mit der Farbe müsste man ändern! Aber ist das Blinken wirklich soo schlecht? Es ist einfach verständlich. Ausserdem wäre der Code kaum kürzer,wenn er mit if/else-if erstellt worden wäre! --Sophieb 02:11, 7. Jan. 2010 (CET)Beantworten
Geändert! Hoffentlich hat es nicht zu viele Fehler. Sonst ist ja immer noch die alte Version aufrufbar! mfg Sophieb 03:49, 7. Jan. 2010 (CET)Beantworten

Wow, auch das Problem mit der sog. "Verdeckung" gut gelöst. Die andere Lösung wäre this gewesen (mein Favorit):

   public Auto(int nummer, string farbe, string typ)
   {
     this.nummer = nummer;
     this.farbe = farbe;
     this.typ = typ;
   }

Zur Methode Blinke(): Es wäre ja nur jeweils ein else vor dem 2. und 3. if(). Würd' ich die jetzige Lösung irgendwo sehen, würd' ich klar davon ausgehen, dass auch 2 oder mehr Bedingungen erfüllt sein können. Gut, Autoblinker kenne ich, aber wäre es irgendwas zur Berechnung einer Steuerabgabe oder eines Handytarifs, sähe das schon anders aus.

Das wäre die "Profi"-Variante:

     if(links && rechts)
     {
       Console.WriteLine( "Der Warnblinker ist an." );
     }
     else if(links)
     {
       Console.WriteLine( "Links blinken" );
     } 
     else if(rechts)
     {
       Console.WriteLine( "Rechts blinken" );
     }

Bei geschickter Reihenfolge der Bedingungen, die "strengste" nach oben, erspart man sich eine Menge Code. Zudem ist "== true" überflüssig, denn links und rechts sind ja bereits boolsche Variablen. Gut, für absolute Anfänger vielleicht etwas gewöhnungsbedürftig, aber schließlich will er/sie C# lernen und nicht PHP ;-) --84.131.151.40 09:52, 7. Jan. 2010 (CET)Beantworten