C# Objektorientierte Programmierung bereitet mir noch Kopfschmerzen

exeto

Lt. Junior Grade
Registriert
Juli 2007
Beiträge
427
Hi

ich mache momentan eine Übung mit C# in Visual Studio Express. Und zwar soll es objektorientiert sein, was mir leider Kopfzerbrechen beschert...
Meine Aufgabe:
WPF Appl.
Projekt: Computer zusammenstellen
Das soll in etwa so funktionieren wie auf den seiten von Dell usw.
Man kann sich alles selbst zusammenstellen, man fängt oben an mit der CPU. Wird dies z.b. ein Intel dann schließt das Programm automatisch alle AMD Mainboards aus da man diese nicht nehmen kann.

Hinter den Auswahlobjekten stehen auch die Preise Wenn man dann alles fertig hat und auf den Button unten klickt, listet der in einem extra Fenster auf was man alles ausgewählt hat, die einzelnen Preise und den Gesamt Preis.

Bei mir scheitert es aber an dem objektorintierten denken.

Ich erstell eine Klasse Computer, in der würd ich dann reinschreiben

public string Prozessor;

usw. für alles, dann erstell ich eine Klasse Prozessor die kriegt Eigenschaften wie Geschwindigkeit, Cache usw alles was ich nehmen kann. Dann erstell ich eine Klasse mit der CPU z.b. i5 und hier kommt dann die genaue Geschwindigkeit rein und der Preis usw.

Ist das so richtig? Der i5 erbt doch dann alles von Klasse Prozessor, das passt ja auch, aber er erbt doch auch alles von der Klasse Computer was nicht geht, da nen i5 kein Mainboard usw. hat
 
Du musst unterscheiden zwischen Member variablen und Vererbungen.

i5 erbt von Prozessor und Prozessor ist eine Member variable von Computer.
 
Hmm, warum überhaupt so kompliziert?

Wenn es so sein wie bei Dell, verstehe ich die Aufgabe etwas anders:
Programmiere ein Darstellungsprogramm für einen Datensatz.

Es gibt einen wie auch immer garteten Datensatz:
Bezeichnung <> Typ <> Hersteller <> etc.

Wenn ausgewählt <Typ Intel> dann filtere in der Darstellung Mainboards vom <Typ Intel> etc.


Oder sehe ich das falsch?
 
Warum ich das so machen soll, joa, ich denke mal wegen Objektorintiert damit ich es verstehe

Ich hab mir das nicht selbst ausgesucht, mache eine Ausbildung zum FIAE
 
Achso die Aufgabenstellung ist so ausformuliert... Ok dann ists wohl wirklich nur Fleißarbeit :)

Edit: Aber nochmal zum Thema.

Computer kann nicht an "Komponenten" vererbt werden. Eine mögliche Vererbung von Computer wäre zum Beispiel ein spezieller Typ Computer.

Du hast quasi sowas (sorry für den JAVA Syntax, aber das Prinzip is ja das selbe):

Code:
public class computer
{
private Prozessor prozessor;
private Mainboard mainboard;
...
}

public class Prozessor
{
private Speed speed;
private Price price;
...
}

// Wenn es jetzt Attribute gibt die nur ein i5 hat wäre es dann:

public class i5 extends Prozessor
{
private i5OnlyAttribut1;
private i5OnlyAttribut2;
..
}

//etc.

//Dann wäre es sowas wie:

meinPC = new Computer();
i5 meini5 = new i5(speed, price, i5OnlyAttribut, ...);
 
Zuletzt bearbeitet:
Funart schrieb:
Du musst unterscheiden zwischen Member variablen und Vererbungen.

i5 erbt von Prozessor und Prozessor ist eine Member variable von Computer.


Member Variable heißt also der Computer hat diese Sachen sozusagen, aber er vererbt nichts daran?

Also müsste ich jetzt z.b. eine neue Klasse erstellen:
{
public class Computer
{
hier kommen dann die Membervariablen rein wie Festplatte, CPU, Graka usw.
und als Vererbung kommt hier rein z.b. Preis
}
}

Dann erstell ich wieder eine neue Klasse:

{
private class Prozessor
{
Vererbung: Geschwindigkeit, Cache und was es alles gibt
}
}

Und dann wieder neue Klasse:

{
private class i5 2500K
{
Und dann auflisten die Geschwindigkeit, den Cache, den Preis usw.
}
}




Sind ja dann einige Klassen

Edit: Ach der schiebt ja alles links an den Rand :/
 
Du bist in der falschen Richtung unterwegs. Eine Klasse Computer in der Form wie du sie hast ist falsch.

Versuchs mal folgenden Gedankenansatz erstelle folgendes:

Klasse CPU:
Eigenschaft: Name, Hersteller, Taktrate usw.
Klasse Grafikkarte:
Eigenschaft: Name, Hersteller, Taktrate usw.
Klasse Arbeitsspeicher:
Eigenschaft: Name, Hersteller, Größe usw.

Mit den Objekten die aus diesen Klassen entstehen "bastelst" du dir den Computer.

Die Abfragen (Ausschlusskriterien z.b Socker xY -> nur AMD CPUs usw.) sind dann das Programmverhalten und überwiegend Fleißarbeit.
 
Naja, warum der i5 ne eigene Klasse braucht ist mir noch unklar.
Wenn er Attribute hat die nicht für alle Prozessoren gelten, dann sehe ich es ein (aus der Realität fällt mir jedoch nichts ein).

Was du erwähnst: Speed, Cache, Preis etc gilt ja für alle Prozessoren.

Code:
i5 = new Prozessor("i5 2500k", "Intel", "50€", 4000);

// für eine Klasse

public class Prozessor
{
[INDENT]private name;
private price;
etc.[/INDENT]
[INDENT]public Prozessor(String name, String Manufacturer, String price, int Mhz)
{
[INDENT]this.price = price;
this.name = name;
etc.[/INDENT]
}[/INDENT]
}
 
Zuletzt bearbeitet: (ach diese formatierung)
Benutz
Code:
-Tags, dann sieht's besser aus :)

Ja, eine Membervariable bedeutet, daß der Computer das Teil hat. Vererben tut eine Klasse an andere Klassen (nicht Objekte!), die von ihr ableiten. In deinem Beispiel würdest du die Klasse i5_2500K von der Klasse Prozessor ableiten (in C# mit "class i5_2500K : Prozessor"). Dann vererbt die Klasse Prozessor alle Membervariablen und Methoden (außer den privaten) an die Klasse i5_2500K.

Edit: xuckz hat allerdings insofern recht, als es wohl besser wäre, nicht für jedes CPU-Modell eine eigene Klasse anzulegen. Betrachte das oben als Beispiel :)
 
G!N schrieb:
Du bist in der falschen Richtung unterwegs. Eine Klasse Computer in der Form wie du sie hast ist falsch.

Versuchs mal folgenden Gedankenansatz erstelle folgendes:

Klasse CPU:
Eigenschaft: Name, Hersteller, Taktrate usw.
Klasse Grafikkarte:
Eigenschaft: Name, Hersteller, Taktrate usw.
Klasse Arbeitsspeicher:
Eigenschaft: Name, Hersteller, Größe usw.

Mit den Objekten die aus diesen Klassen entstehen "bastelst" du dir den Computer.

Die Abfragen (Ausschlusskriterien z.b Socker xY -> nur AMD CPUs usw.) sind dann das Programmverhalten und überwiegend Fleißarbeit.


ok,

ich soll es immer so erstellen "rechtsklick auf WPFApplication1 -> Hinzufügen -> Klasse... -> Klasse" und dann da eine Klasse erstellen

Also ich solle erstmal den Computer weg lassen und eine Klasse CPU erstellen mit Name, Hersteller, Taktrate usw., dann eine Klasse i5 2500K die von CPU erbt und den Daten dann genau Infos zuweist Name = I5 2500k, Hersteller = Intel usw?

edit: so schnell wie ich hier antworten kriege, überschneidet sich ja alles :D
mal gucken was xuckz geschrieben hat
Ergänzung ()

Also ich mache Neues Projekt, dann WPF app., dann erstell ich eine neue Klasse (Prozessor.cs) und in der schreib ich rein:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WpfApplication1
{
    public class Prozessor
    {
        private string Name;
        private string Preis;
        private int Mhz;
    }

    new Prozessor = i5 2500K
    name = ("i5 2500K");
    Preis = ("180 Euro");
    Mhz = 3300
}

nur er zeigt mir bei new Prozessor: Klasse, Delegat...... erwartet
 
Zuletzt bearbeitet:
du solltest dir eventuell nochmal eine Anleitung zu OOP in C# zu Gemüte führen, die Syntax wie du den Konstruktor aufrufst stimmt vorne und hinten nicht (und das weiß ich als jemand der C# nur minimal kennt).
 
Es gibt viele Möglichkeiten, wie man das machen könnte.

Wenn dich das mit den Konstuktor (die Methode einer Klasse, die den selben Namen hat wie die Klasse) noch etwas verwirrt, kannst du den auch weglassen und genau wie bei der Computer Klasse den einzelnen Variablen eines Hardware Teils nach Erstellung einer Instanz Werte zuweisen.


Hier mal ein Beispiel für die Klassen:

Code:
class Computer
    {
        public Prozessor ausgewählterProzessor;
        public Grafikkarte ausgewählteGrafikkarte;
    }

    class Hardware
    {
        public Hardware(string hersteller, string modelname, int preis)
        {
            Hersteller = hersteller; ModelName = modelname; Preis = preis;
        }

        public string Hersteller;
        public string ModelName;
        public int Preis;
    }

    class Prozessor : Hardware
    {
        public Prozessor(string hersteller, string modelname, int preis, int geschwindigkeit, string sockel) : base(hersteller, modelname, preis)
        {
            Geschwindigkeit = geschwindigkeit; Sockel = sockel;
        }

        public int Geschwindigkeit;
        public string Sockel;
    }

    class Grafikkarte : Hardware
    {
        public Grafikkarte(string hersteller, string modelname, int preis, int geschwindigkeitcpu, int geschwindigkeitSpeicher, int größeSpeicher, int directxversion)
            : base(hersteller, modelname, preis)
        {
            GeschwindigkeitCPU = geschwindigkeitcpu; GeschwindigkeitSpeicher = geschwindigkeitSpeicher;
            GrößeSpeicher = größeSpeicher; DirectXVersion = directxversion;
        }

        public int GeschwindigkeitCPU;
        public int GeschwindigkeitSpeicher;
        public int GrößeSpeicher;
        public int DirectXVersion;
    }


Und so könnte man sie dann benutzen:

Code:
Grafikkarte Geforce260 = new Grafikkarte("NVIDIA", "Geforce 260", 100, 550, 1200, 1024, 11);
Prozessor i2500k = new Prozessor("Intel", "i2500k", 150, 3200, "1155");


Computer meinComputer = new Computer();

meinComputer.ausgewählterProzessor = i2500k;
meinComputer.ausgewählteGrafikkarte = Geforce260;
 
so abstrakt ist OO eigentlich gar nicht. Du musst dir nur die Realität vorstellen, umsetzen und dann das unwichtige raustreichen (besser gleich weglassen ;) )

Ums ganz grob zusammenzufassen:

Member (OO = Assoziation etc.) : X hat etwas (im Sinne von es ist Bestandteil von)
Besipiel: ein Computer hat 1 Mainboard evtl. n Grakas oder n CPUs aber vielleicht 0-n Festplatten und eine molekulare Dichte (als Bsp. für unwichtiges ;) )

Vererbung = Y ist ein X d.h. Y hat i.d.R. alle Eigenschaften von X + zusätzliche Informationen/Details
Beispiel: Ein C64 (Y) ist ein Computer (X) d.h. ein C64 hat alles was ein Computer hat jedoch z.B. mit der Einschränkung dass er nur eine Graka/CPU hat und diese nicht modifizierbar sind und dass er noch einen Catridgeleser hat, den "normale" Computer nicht haben.
 
Code:
{
    public class Computer
    {
        public Prozessor MeinProzessor;
    }      
    public class Hardware
    {
        public string Hersteller;
        public string ModelName;
        public int Preis;
    }
    public class Prozessor : Hardware
    {
        private int Kerne;
        private int Threads;
        private bool Turbo;
        private bool Multiplikator;
        private string Cache;
    }
}

Sp müsste das doch auch gehen oder?
Hersteller, Modellname und Preis, brauch ich ja nicht nochmal unter Prozessor.
 
edit: Computer sollte evtl. auch von Hardware abgeleitet sein

edit2: was genau ist der Unmterschied zum Beispiel von Keldrik?

edit3: public Attribute (bei Hardware u. Computer) sind in der Regel nicht gut. Entweder protected oder private + get/set Methoden benutzen
 
Zuletzt bearbeitet:
FunnyName schrieb:
evtl. solltest du Computer auch noch von Hardware ableiten, aber ja so ist es auch möglich bzw. sogar besser :-)

Code:
public class Hardware
{
public Computer meinComputer

public string Hersteller;
public string ModelName;
public int Preis;
}

so meinste das?



Wenn ich das aber so mache wie ich den Code hier geschrieben habe.
Wie erstelle ich dann einen neuen Prozessor?

Code:
Prozessor 2500k = new Prozessor

Und wie krieg ich jetzt die ganzen Infos zum 2500K?
Ergänzung ()

antwort auf edit2: Keine Ahnung hab da irgendwie die übersicht verloren, da stand alles in klammern dahinter und wenn man es ausgeben will muss man es in der reihenfolge aufschreiben.

Code:
class Prozessor : Hardware
{
public Prozessor(string hersteller, string modelname, int preis, int geschwindigkeit, string sockel) :[B] base(hersteller, modelname, preis)[/B]
{
[B]Geschwindigkeit = geschwindigkeit; Sockel = sockel;[/B]
}
 
[B]public int Geschwindigkeit;
public string Sockel;[/B]


warum da "base" steht versteh ich auch nicht
und darunter nochmal geschwindigkeit = geschwindigkeit
und nochmal public int geschwindigkeit
 
Zuletzt bearbeitet:
nein abgeleitet = erbt von. Ich meine

Code:
 public class Computer : Hardware

denn auch ein Computer wird Name, Preis und 'nen Hersteller haben

Die Attribute bekommst du natürlich über den Konstruktor in das Objekt (siehe Code von Keldrik)

edit: das was Keldrik da geschrieben hat ist ein Konstruktor. D.h. du kannst beim new die entsprechenden Attribute übergeben. Wenn du das weglässt hat die Klasse nur einen Default Konstruktor (den siehst du nicht im Code) und der macht halt nix außer ein Objekt der Klasse zu erstellen.

das base bedeutet dass der Konstruktor von Keldrik den entsprechenden Konstruktor der Basisklasse (in dem Fall Hardware) aufruft da ja Hardware die 3 Attribute (Hersteller, Preis, Name) verwaltet.

Zum Thema Konstruktor empfehle ich dir mal ein Tutorial oder so zu lesen. Jedenfalls weist er dort den Wert von geschwindigkeit dem du dem Konstruktor übergibst dem Attribut Geschwindigkeit der Klasse Prozessor zu.

Beachte das sind 2 unterschiedliche "Variablen" die sich in ihrem Namen unterscheiden (Groß-/Kleinschreibung). Normalerweise versucht man die Namen deshalb unterschiedlich zu wählen bzw. irgendwie kenntlich zu machen dass es sich bei einem um den Parameter aus dem Konstruktor handelt (z.B. pGeschwindigkeit) Zumindest im Java Umfeld.

Besipiel (bin kein C# deswegen Syntax vielleicht nicht 100% ig ok)

Code:
Prozessor i2500k = new Prozessor ("Intel", "i2500k", 20, 4, "AM3+")
 
Zuletzt bearbeitet:
ok solangsam kommt licht ins dunkle

danke an alle erstmal
 
Wenn du mehr wissen möchtest, schau doch am besten bei MSDN vorbei (als Einstieg ist das hier sicherlich interessant für dich). Dort wird alles mehr als ausführlich erklärt. Gut ist auch das folgende Buch: Visual C# 2010. Was die Benennung von Variablen, Methoden, Klassen usw. angeht, solltest du dich an die MSDN Guidelines richten.
 
Habe jetzt alle Klassen erstellt.
Als Konstruktor habe ich z.B.:

Code:
public Prozessor(string name, string hersteller, string modelname, int preis, int kerne, int threads, string mhz, bool turbo, bool multiplikator, string cache)
            : base(name, hersteller, modelname, preis)

Dann habe ich in meinen MainWindow, z.B. nen Prozessor angelegt:

Code:
Prozessor i52500K = new Prozessor("Intel i5 2500K", "Intel", "i5 2500K", 180, 4, 4, "3.30Ghz", true, true, "L3 6MB shared");


Ich wollte jetzt eine Combobox anlegen, wo alle namen meiner Prozessoren untereinander stehen.
Ich wollte die aber nicht nochmal alle als string reinschreiben, sondern habe gedacht das man die irgendwie abfragen kann. get name von prozessoren.
Könnte mir hierbei wer helfen, wie ich sowas hinbekomme?
 
Zurück
Oben