| Autor |
Beitrag |
HaPe60
Hält's aus hier
Beiträge: 4
|
Verfasst: Mo 03.09.12 15:49
Ich möchte einen eigenen Variablentyp (z.B. mit dem Namen "Temperatur") in c# definieren, der alle Eigenschaften und Methoden von z.B. double enthält und zusätzlich noch um ein paar Methoden (z.B. ToFahrenheit (für Umrechnungen)) erweitert ist, so dass dann letztlich so etwas wie nachfolgend mögich ist (nur als Beispiel).
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| private Temperatur t1; private Temperatur t2; private Temperatur t3; private double x; t1 = 5; t2 = 10; t3 = t1+t2; x = t3.ToFahrenheit; ..... |
Ist das in c# möglich und wenn ja, wie muss ich den Variablentyp "Temperatur" definieren?
Moderiert von Th69: I- durch C#-Tags ersetzt
|
|
Cäptin Pommes
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Mo 03.09.12 16:30
du schreibst dir eine Klasse Temperatur da stellst du dann alle Methoden und Properties bereit die du brauchst/willst.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 03.09.12 16:46
Sinples Grundgerüst:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| struct Temperatur { private double _Value; public double Value { get { return this._Value; } set { this._Value = value; } }
public Temperatur(double Value) : this(0) { } public Temperatur(double Value) { this.Value = Value; }
public Temperatur ToFahrenheit() { Temperatur result = new Temperatur(); return result; }
} |
Sollte als Erklärung reichen, wenn nicht, dann lies ein gutes Buch oder schaue zumindest ein paar Tutorials, denn ohne dieses Grundwissen wird das nix.
Wenn du exakt das haben willst, was man auch mit double machen kann, dann leite doch von double ab und überschreibe die Methoden, die du überschrieben haben willst.
Dann musst du das nicht alles neu definieren.
Zuletzt bearbeitet von Palladin007 am Mo 03.09.12 16:57, insgesamt 1-mal bearbeitet
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 03.09.12 16:47
| Zitat: | | du schreibst dir eine Klasse Temperatur da |
wenn es einem eingebauten Typ gleichen soll besser einen struct.
| Zitat: | | Ist das in c# möglich und wenn ja, wie muss ich den Variablentyp "Temperatur" definieren? |
Wenn du etwas genau wie double willst aber mit ein paar Zusatzmethoden solltest du vielleicht einfach double weiterverwenden und dir ein paar Extension Methods schreiben.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 03.09.12 16:57
Das als struct zu definieren ist eine gute Idee, ich ändere das gleich in meinem Grundgerüst oben.
Allerdings würde ich keine Erweiterungs-Methoden erstellen, da die dann ja auch für eine normale Variable vom Typ double zur Verfügung stehen.
Die Vererbung ist aber sinnvoll, wobei ich allerdings noch darüber nach denken würde, gar nicht erst einen neuen Typ zu definieren, sondern eine ein paar statische Methoden, die entsprechende Aufgaben erledigen und als Parameter double verlangen. Das wäre deutlich einfacher und schneller erledigt.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 03.09.12 17:00
| Zitat: | | Die Vererbung ist aber sinnvoll, wobei ich allerdings noch darüber nach denken würde, gar nicht erst einen neuen Typ zu definieren, sondern eine ein paar statische Methoden, die entsprechende Aufgaben erledigen und als Parameter double verlangen. Das wäre deutlich einfacher und schneller erledigt. |
Das wären dann identisch zu den Extension Methods. Extension Methods kann man übrigens auch einfach so aufrufen ohne die ~Extension~ Magie 
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 03.09.12 17:06
Ich meinte bloß, dass ich es etwas unpassend finde, bei einem Datentyp wie double Methoden zu finde, die im Prinzip keine normale Zahl darstellen sondern eine Temperatur. Gut, das ist auch nur eine simple Zahl, aber eben doch eine andere Zahl ^^
Vielleicht verstehst du, was ich meine ^^
Aber wie dem auch sei, ich denke wir haben eigentlich jede Möglichkeit gegeben, die er für sein Programm nutzen kan, alles andere ist jetzt Geschmackssache. Ein eigener Typ, eine Erweiterungs-Methode oder eine normale statische Methode, jeder wie er will ^^
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 03.09.12 17:29
| Zitat: | | Vielleicht verstehst du, was ich meine ^^ |
Man kann die Methode ja auch anders nennen. double.IfValueIsPresentingACelsiusTemperatureThenConvertToFahrenheit. Besser?
Das Problem hast du übrigens in deinem Temperatur struct auch solange du nicht die Einheit in deinem struct (Celsius, Fahrenheit, Delisle, Rankine etc.) mitschleppst weiß man nie ob man die sinnvoll aufrufen kann.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mo 03.09.12 21:35
Also ich würde das jetzt ungefähr so machen: C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public struct Temperature { public enum Scale { Kelvin, Celsius, Fahrenheit, Rankine };
private static double[] offset = { 0, 273.15, 459.67, 0 }; private static double[] factor = { 1, 1, 5.0 / 9, 5.0 / 9 }; private static string[] unit = { " K", " °C", " °F", " °R" };
private double Value;
public Temperature(double value, Scale Scale) { int index = (int)Scale; Value = (value + offset[index]) * factor[index]; }
public double getValue(Scale Scale) { int index = (int)Scale; return Value / factor[index] - offset[index]; }
public static Temperature operator +(Temperature a, Temperature b) { return new Temperature(a.Value + b.Value, Scale.Kelvin); } public static Temperature operator -(Temperature a, Temperature b) { return new Temperature(a.Value - b.Value, Scale.Kelvin); } public override string ToString() { return ToString(Scale.Celsius); } public string ToString(Scale Scale) { return getValue(Scale).ToString() + unit[(int)Scale]; } } |
Der struct ist jetzt zwar immutable, d.h. su musst den Konstruktor benutzen. Aber das ganze Umrechnungszeug ist da schön verpackt
(Aber schön dran denken, falls du Temperaturdifferenzen behandelst, immer in Kelvin angeben  )
|
|
|