Objekt in Klasse erzeugen und ausgeben
-
Hallo,
ich habe 20 Variablen (private) in einer Klasse. Ich möchte mit der set() und get() Klassenmethode auf die Variablen zugreifen. DAmit ich aber nicht 20 Klassenmethoden je für get() und set() schreiben muß, müßte es doch möglich sein, in der Klasse ein Objekt von der Klasse zu erzeugen und somit auf die Felder über das Objekt mit den beiden Methoden zugreifen zu können. Ist das möglich? Hat k
jemand ein Codeschnippsel? Habe mal damit angefangen zu probieren.
Gruß
Moehrle
-
moehrle schrieb:
müßte es doch möglich sein
So? Warum? Wegen Dir?
Simon
-
Ev. sind Indexer das was Du suchst.
http://msdn.microsoft.com/en-us/library/6x16t2tx.aspxAllerdings verstehe ich deine Fragestellung nicht so ganz.
Simon
-
Hallo, mit Indexern habe ich das schon einmal getestet. Jetzt habe ich aber verschiedene Datentypen. Im Array kann ich nur einen Datentyp verwenden.
-
du kannst object als datentyp nehmen , der kann alle typen anehmen.
dann mach sowas
object GetVar(int iIndex){ } void SetVar(object var,int iIndex){ }
sind hat keien Getter und Setter Propertys mehr in dem Sinne.
-
Dieses Vorgehen scheint mir nur deine Tipp- Arbeit zu verkleinern.
Es ist Fehlerträchtig und du verlierst die Typisierung.Simon
-
Wieso verwendest Du keine Properties? Die Getter/Setter sehen mir nach einem fetten Designfehler aus.
-
Hallo, gibts da irgendwo ein Besipiel.
Gut wäre es, wenn ich die Klassenvariablen (Variablennamen) mit einer Textdatei einlesen könnte. Somit könnte ich danach die Daten wieder zurückschreiben und habe somit Objektvaribalenwerte gleich abgespeichert.
Ich bin aber noch nicht s ganz auf den Trichte rgekommen, wie ich das ma enialsten und einfachsten machen soll.
-
Hatten wir das nicht schon mal mit Dir?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-222607.html
Simon
-
So wärs auch toll für C#.
Aber wie ists da bei dem Konstruktor mit der : Zuweisung. Gibts in C# nicht in dem Stil. Wie wird das da angelegt?
-
moehrle schrieb:
So wärs auch toll für C#.
Aber wie ists da bei dem Konstruktor mit der : Zuweisung. Gibts in C# nicht in dem Stil. Wie wird das da angelegt?man schreibt es direkt im rumpf des constructors - wo ist das problem? #gg
ich schreib auch noch nicht so lang in c# - kann es wirklich sein das es keinen operator[] gibt? war ganz verduzt als ich diesen ueberladen wollte #gg
//dazuedit
man sollte erst selber n bissl rumschaun statt doof zu fragen #ggclass Test { string[] _a = { "a", "b", "c" }; public string this[int i] { get { return _a[i]; } set { _a[i] = value; } } }
die syntax is doch ziemlich anders zu cpp #gg
-
internal class DoubleValues { private double[] values = new double[0]; public void ReadFromFile(string filename) { List<double> list = new List<double>(); using (StreamReader reader = File.OpenText(filename)) { string line = null; while ((line = reader.ReadLine()) != null) { double value = 0.0f; if (double.TryParse(line, out value)) { list.Add(value); } } } values = list.ToArray(); } public double[] Values { get { return values; } } }
Simon
-
ich schreib auch noch nicht so lang in c# - kann es wirklich sein das es keinen operator[] gibt? war ganz verduzt als ich diesen ueberladen wollte #gg
Doch gibts und kann überladen werden.
Simon
-
Danke Simon G.
Funktioniert soweit. Bin gerade dabei, mein ursprüngliches Problem wieder aufzugreifen. Ich möchte das Problem nochmals beschreiben.
ich möchte eine Klasse mit ihren Elementvariablen erzeugen. Nun habe ich mir überlegt, wie ich die Klasse mit ihren Elementvariablen anpassungsfreundlich erzeugen kann. Dazu habe ich mir folgenden ausgedacht. Ich erzeuge eine Textdatei mit den Namen der Elementvariabeln welche sie Klasse bekommen soll. Diese Texdatei muß natürlich immer dem Projekt beiliegen, damit beim starten des Projekts die Klasse aufgabut werden kann. Ich bin somit in der Lage einer Variable einen anderen Namen zu geben, oder mehrere Elementvariablen der Klasse beifügen zu können.
Wenn das funktionieren würde, möchte ich später Files nach gleichnamigen Namen wie dei Elemtvariablen durchsuchen und dann die Zahlenwerte den Elemntvariablen eines erzeugten Objektes der Klasse übergeben, damit man damit rechnen kann.
Nun kann ich im Konstruktor ein File einlesen, aber diese Bezeichnungen, wie bekomme ich die als Elemntvariablen der Klasse hingebogen? Dass ist wohl einer der schwersten Hürden??
-
Du könntest deine Klasse von Dictionary ableiten.
class YourClass:Dictonary<string,double> { public YourClass() { Add("Variable 1",1.2); Add("Variable 2",1.3); Add("Variable 3",3.4); } } static void Main() { YourClass yourObject = new YourClass(); yourOject["Variable 3"] = yourObject["Variable 2"] - yourObject["Variable 1"]; }
-
Sorry, aber das was du vorhast scheint mir von ziemlich schlechtem Design zu zeugen. Schildere doch mal dein Vorhaben etwas genauer, damit wir dir bessere Lösungsvorschläge bieten können. Eine Textdatei zu parsen und daraus Properties erzeugen und auch noch dem Rest des Programms klarzumachen ist so nicht möglich.
Auch die Lösung von Andorxor wird nicht helfen, da du ja auch Namen ändern/hinzufügen/löschen möchtest.
-
Also, ich möchte Berechnungen für eine Schleifscheibe durchführen. Die Schleifscheibe hat bestimmte Maße. Mit diesen Maßen muß ich rechnen. Dazu ist ja sinnvoll eine Klasse zu bilden. Nun kann ich die Klassenelemente von Hand definieren. Toll wäre es aber, wenn ich ein Textfile einlesen könnte, wo ich die ganzen Variablennamen eingetragen habe. Das hat den Vorteil, wenn die Variablennamen irgendwann umbenannt werden, oder ich könnte x-beliebiege zzufügen. Startet man dann das Programm neu, wird die Klasse automatisch erweitert.
Vieleicht ist das auch eine Scheißidee.
Grundsätzlch habe ich im Konstruktor schon die Datei mit den Variablennamen eingelesen. Aber dann würde ich diese gerne als Elemntvariablen zuordnen. Aber das funktioniert wohl nicht.
Wäre es möglich, könnte ich ein Objekt der Klasser erzeugen, und mit objekt.name darua zugreifen. Wie könnte man das ralisieren?
-
Nun wird es wohl so sein, das ich einfach beginne. Diese vorhin genannte Sache kann ich später immer noch abändern. Ich werde nun die Klasse ganz normal mit ihren Elemtvariablen anlegen. Die Werte die ich dann den Elemtvariablen der Klasse zufügen muß, lese ich aus einer Textdatei ein (das funktioniert auch), und schreibe die in ein Array, das ich in der Klasse angelegt habe. Meine Frage, wie greife ich auf die Felder vom Array zu, wenn ich es in einer Klasse als Elemetvariable angelegt habe? Ich muß ja dann für Berechnungen auf diese Daten zugreifen können. Oder erstellt man noch ein Objekt in der Klasse selbst um auf die DAten im Array zzugreifen zu können(bloß wie geht das ganau, habe dazu nichts gefunden)??
Variante von Simon:
namespace Scheiben_Daten { public class DoubleValues { private double[] values = new double[0]; public void ReadFromFile(string filename) { List<double> list = new List<double>(); using (StreamReader reader = File.OpenText(filename)) { string line = null; while ((line = reader.ReadLine()) != null) { double value = 0.0f; if (double.TryParse(line, out value)) { list.Add(value); } } } values = list.ToArray(); } public double[] Values { get { return values; } } } }
oder meine Variante:
namespace Scheibenprogramm { class Klasse_ScheibenEinAuslesen:Dictionary<string,double> { public Klasse_ScheibenEinAuslesen() { List <string> liste = new List<string> (); StreamReader sr = new StreamReader("c:\\Scheibenparameter.sch"); string s; while(sr.Peek() != (-1)) { s = sr.ReadLine(); if (s != "") { Add(s, 0.0); liste.Add(s); } } } } }
oder Meine zweite Variante:
namespace Scheibenprogramm { class ScheibenData:Dictionary<string,double> { public double Werkzeugdurchmesser; public double Seelendurchmesser; public double Drallsteigung; public double Einstellwinkel; public double Spanwinkel; public double Messtiefe; public double Zähnezahl; public double BreiteAbsetzung; public double Absetzungstiefe; public double Absetzungswinkel; public double Scheibendurchmesser; public double Kantenradius; public double Radiusbegrenzungswinkel; public double Schnittmaß; public double Winkelberechnen; public double Winkel1; public double BreiteWinkel1; public double Winkel2; public double Scheibenbreite; public double Radius2; public double Schneidenlänge; public double MitZweiSchnitten; double[] arrScheibenData = new double[22]; } }
Wenn ich von den Klassen Objekte erzeuge, wie komme ich dann an die Daten der Arrays oder des Dictionarys ran? Wie hole ich die mir her? es gibt da die Eigenschaft Values, ich weiß aber nicht wie ich mit der arbeiten soll. Da fällt mir noch was ein. gibt es irgendwo eine Übericht über die Stanardmethoden und Eigenschaften der Klassen, wo die Funktionen davon erklärt sind? (.ToString() , .Add() ) und diese ganzen ... Habe schon danach gesucht aber nichts gefunden.
-
Ja, nennt sich MSDN.
Am einfachsten ist es zu googlen: MSDN List.AddSimon
Edit: Das ist übrigens nicht meine Lösung zu deinm Problem, denn ich kenne dein Problem gar nicht. Der obige Code war mit sehr wenig Kontext Infomation entstanden.
-
Hallo
ein kleiner Ausschnitt aus der Klasse:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace Scheibenprogramm { public class ScheibenData { private double werkzeugdurchmesser; private double seelendurchmesser; private double drallsteigung; private double einstellwinkel; private double spanwinkel; public double Werkzeugdurchmesser { get { return werkzeugdurchmesser; } set { if ((werkzeugdurchmesser) >= 0.5 && (werkzeugdurchmesser <= 200)) werkzeugdurchmesser = value; else AusgabeFehlermeldung("Werkzeugdurchmesser"); } } public double Seelendurchmesser { get { return seelendurchmesser;} set { if ((seelendurchmesser >= 0.05) && (seelendurchmesser <= 150.0)) seelendurchmesser = value; else AusgabeFehlermeldung("Seelendurchmesser"); } } ...
Die Properties muss ich nun füllen. Entweder über mein Formular, was ja mit der Zuweisung kein Problem ist. Die andere Möglichkeit ist das einlesen über eine Datei. Wenn in der Datei die Bezeichnung werkzeugdurchmesser = 20.3
steht, muß ich das in Objekt.werkzeugdurchmesser = 20.3
zuweisen. Nun lese ich aber die Datei zeilenweise in ein Array ein. Später würde ich dann gerne den Properties über eine Schleife die Werte aus der Datei zuordnen. Kann ich das irgendwie automatisch realisieren? WIe gesagt, es können später mehr als 30 Properties sein. Oder muß ich dann für jedes Element des Objektes mit einer Schleife das Array durchlaufen lassen, um bei Übereinstimmung den betreffenden Wert zuweisen zu können? Das ist zwar Tipparbeit, aber führt auch zum Ziel. Mit welcher Funktion bekomme ich von der Property des Objektes den Namen zurück? BEispiel: ( string name = Objekt.spanwinkel) , damit ich in name den Propertynamen erhalte.