Hallo Leute,
bin ein wenig am Verzweifeln, weil ich folgenden Code nicht toll finde. Es funktioniert alles einwandfrei, aber ich habe das Gefühl, der objektorientierten Programmierung nicht gerecht zu werden.
Dies ist der Code:
using System.Windows.Forms;
public class MyFlugzeugspiel
{
public static void Main(string[] args)
{
PictureBox flugzeug;
MyFlugzeug myFlugzeug = new MyFlugzeug(global::Flugzeugspiel.Properties.Resources.MyRedFlugzeug, null, 0);
flugzeug = myFlugzeug.getAircraft(10, 150, 98, 27);
ScrollingBackground himmel = new ScrollingBackground("THE FLIGHTER", 1000, 650, flugzeug, null, flugzeug, 5);
}
}
using System.Windows.Forms;
using System.Drawing;
public abstract class Flugzeug : Form
{
protected PictureBox picBoxImage;
private Bitmap myFlightPic;
public Flugzeug(Bitmap myFlugzeug)
{
this.myFlightPic = myFlugzeug;
}
public PictureBox getAircraft(int x, int y, int width, int height)
{
// Flugzeug wird erschaffen
picBoxImage = new PictureBox();
picBoxImage.Image = myFlightPic;
picBoxImage.BackColor = Color.Transparent;
picBoxImage.SetBounds(x, y, width, height);
return picBoxImage;
}
}
using System.Drawing;
using System.Windows.Forms;
public class MyFlugzeug : Flugzeug
{
private int finenessOfAirplaneMotion;
public MyFlugzeug(Bitmap myFlightPic, PictureBox picBoxImage, int finenessOfAirplaneMotion)
: base(myFlightPic)
{
this.picBoxImage = picBoxImage;
this.finenessOfAirplaneMotion = finenessOfAirplaneMotion;
}
protected void flugzeugBewegen_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.W)
{
if (picBoxImage.Top > 10)
{
picBoxImage.Top -= this.finenessOfAirplaneMotion;
}
}
if (e.KeyCode == Keys.S)
{
if (picBoxImage.Top < 315)
{
picBoxImage.Top += finenessOfAirplaneMotion;
}
}
}
}
using System.Drawing;
public class FeindFlugzeug : Flugzeug
{
public FeindFlugzeug(Bitmap myFlightPic) : base(myFlightPic)
{
}
}
using System.Drawing;
using System.Windows.Forms;
public class ScrollingBackground : MyFlugzeug
{
public ScrollingBackground(string name, int size1, int size2, PictureBox flugzeug, Bitmap myFlightPic, PictureBox picBoxImage, int finenessOfAirplaneMotion)
: base(myFlightPic, picBoxImage, finenessOfAirplaneMotion)
{
// Windows-Fenster wird erschaffen
this.Text = name;
this.Size = new Size(size1, size2);
this.StartPosition = FormStartPosition.CenterScreen;
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Controls.Add(flugzeug);
this.KeyDown += new KeyEventHandler(this.flugzeugBewegen_KeyDown);
this.ShowDialog();
}
}
Hoffe, ihr erschreckt nicht an der Fülle des Codes. Aber kürzer konnte ich es jetzt nicht zusammenfassen.
Dieser Code funktioniert einwandfrei.
Aber was mir nicht gefällt, ist folgendes:
flugzeug = myFlugzeug.getAircraft(10, 150, 98, 27);
ScrollingBackground himmel = new ScrollingBackground("THE FLIGHTER", 1000, 650, flugzeug, null, flugzeug, 5);
Ich möchte gerne, dass eben die Methode getAircraft so aussieht: getAircraft(10, 150, 98, 27, 5);
Die 5, also finenessOfAirplaneMotion sollte nicht der Konstruktor haben, sondern eben die Methode getAircraft. Die sollen doch zusammen sein, ist doch viel schöner.
Da ja vieles von der Hauptklasse Flugzeug, aber auch von MyFlugzeug geerbt wird, muss ich natürlich jedesmal, wenn der Konstruktor einer Subklasse aufgerufen wird, die der Hauptklasse auch aufrufen, ist ja klar, weil ja erst die Hauptklasse konstruiert werden muss, bevor ich überhaupt die Subklasse nutzen kann.
Aber, was mir dort nicht gefällt, ist folgendes:
MyFlugzeug myFlugzeug = new MyFlugzeug(global::Flugzeugspiel.Properties.Resources.MyRedFlugzeug, null, 0);
ScrollingBackground himmel = new ScrollingBackground("THE FLIGHTER", 1000, 650, flugzeug, null, flugzeug, 5);
Ständig diese Null-Lückenfüller. Wie kann man diese schrecklichen Lückenfüller umgehen?
Man kann doch z. B. keinen anderen Entwickler zumuten, meine Klassen zu verwenden, oder?
Oder ist das normal? Macht man das so?
Hänge momentan ein wenig, wie ich meinen Programmierstil wesentlich verbessere.
Ich würde mich echt auf eure etwaigen Codebeispiele und Antworten freuen und bedanke mich recht herzlich.
Ich wünsche euch was!
LG Serun
Zuerst einmal ich hab schon deutlich schlimmeres gesehen.
"Schlecht" ist es Trotzdem.
Was du dir direkt mal anschauen kannst sind die wiki:Prinzipien objektorientierten Designs und wiki:Entwurfsmuster .
Im Detail möchte ich da jetzt eigendlich nicht eigehen würde wohl was länger werden.
Ein paar Anmerkungen vieleicht noch.
Du benutzt an ein paar Stellen unnötig die Vererbung. (Flugzeug muss nicht von Form erben, das kannst du z.B. mit einer Factory (Entwurfsmuster) bekommen).
Du kannst auch mehrer Konstrukter mit unterschiedlichen Parameten anbieten. (Sollte deine "NULL" angaben erüberigen.)
Sollte man mal gelesen haben:
Hi Serun,
ich würde dir für den Einstieg diesen Artikel empfehlen: [Artikel] Drei-Schichten-Architektur.
Was du machst, ist genau das Gegenteil von Schichtentrennung. Deine einzelnen Schichten sind nicht unabhängig voneinander und können auch nicht unabhängig voneinander weiterentwickelt oder getestet werden.
Christian
Weeks of programming can save you hours of planning
Hey Leute,
danke für eure Antworten!
Ja, ist schlimm, aber ich lese eure vorgeschlagenen Artikel durch und überarbeite es dann nochmal!
LG