Hey Leute,
ich bin gerade dabei, einen Taschenrechner zu programmieren. Dabei ist mir aufgefallen, dass ich da 2 sich ähnelnde Möglichkeiten habe.
Möglichkeit 1:
using System;
using System.Collections.Generic;
using System.Text;
namespace Bruch
{
class Rechnung
{
//Member deklarieren
int zähler;
int nenner;
//Eigenschaften
public int Zähler
{
get { return zähler; }
set { zähler = value; }
}
public int Nenner
{
get { return nenner; }
set { nenner = value; }
}
//Methode Frage
public void Frage()
{
Console.Write("Zähler: ");
Zähler = Int32.Parse(Console.ReadLine());
Console.Write("Nenner: ");
Nenner = Int32.Parse(Console.ReadLine());
}
//Methode Zeige
public void Zeige()
{
Console.Write("Der Bruch lautet: " + Zähler + "/" + Nenner);
Console.ReadLine();
}
//Methode Addiere
public void Add(){
}
}
und Möglichkeit 2:
using System;
using System.Collections.Generic;
using System.Text;
namespace Bruch
{
class Rechnung
{
//Member deklarieren
int zähler;
int nenner;
//Methode Frage
public void Frage()
{
Console.Write("Zähler: ");
zähler = Int32.Parse(Console.ReadLine());
Console.Write("Nenner: ");
nenner = Int32.Parse(Console.ReadLine());
}
//Methode Zeige
public void Zeige()
{
Console.Write("Der Bruch lautet: " + zähler + "/" + nenner);
Console.ReadLine();
}
//Methode Addiere
public void Add()
{
}
}
}
Bei der zweiten Möglichkeit habe ich die Eigenschaften weggelassen und für meine Frage und Zeige Methode die Member zähler und nenner einlesen lassen.
Bei der ersten Möglichkeit hingegen habe ich bei der Frage und Zeige Methode die Eigenschaften einlesen lassen, die ja die Schnittstellen für meine Member sind. Beides funktioniert, nur was ist im Sinne der OOP richtig?
PS: Ich habe in meiner Main() Methode eine Instanz (Objekt) von der Klasse Rechnung erzeugt. Das sieht dann so aus:
using System;
using System.Collections.Generic;
using System.Text;
namespace Bruch
{
class Program
{
static void Main(string[] args)
{
Rechnung bruch1 = new Rechnung();
bruch1.Frage();
bruch1.Zeige();
}
}
}
Hallo,
ich würde dir raten, Tastatureingaben in deinem Objektmodell zu vermeiden. Wenn du eine Klasse schreibst, die einen Bruch abbildet, ist das eine gute Idee. Tastatureingaben sollten aber IMMER nur durch die Main Methode gemacht werden, und an die jeweiligen Klassen weitergegeben werden. Dazu hast du ja auch schon Eigenschaften definiert. Wenn du deine Klasse irgendwann einmal in einer Win-Form Applikation einsetzten willst, wirst du mit den Conse.ReadLine() Aufrufen Probleme bekommen. Deshalb: Tastatureingaben und Objektmodell immer strikt trennen. Ich hoffe das war einigermaßen verständlich erklärt =)
Gruß
das hieße dann ja, dass ich zwei variablen in meiner Main() Methode erzeugen muss, die mittels console.writeline und console.readline eingelesen werden und einen wert bekommen? mithilfe meiner eigenschaften, die ich in der klasse rechnung geschaffen habe, können auf die variablen dann auch von der klasse rechnung zugegriffen werden?
nur mal so am rande: ich bin noch neu in der welt von c# und wir haben das projekt taschenrechner in unseren vorlesungen gehabt. dort haben wir es nicht so gemacht, dass wir die variablen in der main() methode deklariert und eingelesen haben. wir haben es eher so gemacht, wie ich es gepostet habe. nur ist mir dann dabei aufgefallen, dass ich zwei möglichkeiten habe...
aber ich glaube, dass ich dich schon verstanden habe. nur ist das dann nicht an der OOP vorbeiprogrammiert? ich meine, es so verstanden zu haben, dass in der main methode lediglich die objekte erzeugt werden und in den klassen die baupläne meines bruches sind? das ist doch der witz bei der oop, oder?
Original von al3ko
ich meine, es so verstanden zu haben, dass in der main methode lediglich die objekte erzeugt werden und in den klassen die baupläne meines bruches sind? das ist doch der witz bei der oop, oder?
der witz an der oop ist vor allem, dass klassen wiederverwendbar sind. das wäre aber nicht der fall, wenn du darin daten per Console.ReadLine() einliest. Denn dann wären deine klassen auf den anwendungstyp konsolen-applikation beschränkt.
Hi Al3ko!
Ich kenne solche "Beispiele" und Probleme aus eigener Erfahrung...
Du schreibst in Deinem ersten Posting dass Du ja "eigentlich" 2 Möglichkeiten
hast auf die Klassenvariablen zuzugreifen. Das ist "eigentlich" schon richtig.
Auf die Variablen einer Klasse sollte ja nicht von aussen, also von einer
anderen Klasse, direkt zugegriffen (lesend und schreibend) werden können.
Aus diesem Grund sind sie als PRIVATE deklariert.
Weil man aber trotzdem von aussen Werte an die Klasse übergeben können
muss gibts die Eigenschaften, die mit get und set die Werte aus den
Klassenvaris auslesen bzw. in sie speichern.
Möchte ich aber Werte der Klassenvariabeln direkt aus der Klasse abrufen,
brauch ich dazu keine Eigenschaften weil ich direkten Zugriff habe.
(Deine 2. Möglichkeit)
Gemixt mit den Antworten meiner Vorposter gibts für Dich aus OO-Sicht
daher "eigentlich" nur eine Möglichkeit:
Die Klasse Rechnung aus Möglichkeit 1 (ohne die Methode Frage).
Das Einlesen der Werte für Zähler und Nenner übernimmt in deinem Fall die Main().
Und "eigentlich könnte man sich aber für die Methode "Zeige" auch etwas anderes
einfallen lassen.... zb. einfach nur den String returnen und in der Main ausgeben...
using System;
using System.Collections.Generic;
using System.Text;
namespace Bruch
{
class Program
{
static void Main(string[] args)
{
Rechnung bruch1 = new Rechnung();
bruch1.Nenner = Int32.Parse(Console.ReadLine());
bruch1.Zähler = Int32.Parse(Console.ReadLine());
System.Write(bruch1.Zeige());
}
}
}
Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂
Original von regen
Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂
jaa, das weiß ich ja. das sollte allerdings das geringste problem sein. mir geht es erstmal ums prinzip der klassen und der oop. ich verstehe eure beiträge und argumente. werde mal gucken, wie ich das mache, erstmal für die prüfung morgen büffeln 8)
Original von nils
Original von regen
Da kannst du dann im Setter vom Zähler auch gleich auf != 0 prüfen 🙂ich denke die prüfung im nenner wäre sinnvoller 🙂 oder ? 8)
achwas 😁
ja, stimmt, verwechselt 🙁