H
@blubb:
Und weitere Fragen zu deinem Ansatz:
Was meinst du mit "Kaum willst du ihn benutzen, musst ohnehin immer wieder den refernzierten Typ abfragen"?
Ich hab ueberlegt, wie meine Loesung mit Interfaces harmoniere wuerde. Mir kam folgender Gedanke: Hinter der Achse steht ja eigentlich der Gedanke, Werte aus einem Problembereich in ein Koordinatensystem abzubilden. Diese Werte haengen
vom Problem ab, also werden bspw. Zeitangaben, Datumsangaben, Numerische Werte auf ein Koordinatensystem abgebildet.
Aber nicht nur die darzustellenden Werte benoetigen Information darueber, wie sie aufs Koordinatensystem abgebildet werden, auch andere Elemente eines Diagramms benoetigen diese Information auch. So z.B. die Achsenunterteilung, Gridlines, ...
Alle diese Elemente muessten dann die benoetigen Interfaces implementieren. Das schreckt mich etwas ab.
Daher ein anderer Ansatz. Ein sog. AxisMapper uebernimmt die Transformation von Problembereich in Koordinatensystem.
Die Klasse Axis erhaelt z.B. einen solchen AxisMapper, aber auch die Klasse Gridlines, saemtliche Plotklassen (LinePlot, BarPlot...) Der AxisMapper (abstract class AxisMapper) muss jedoch in den Problembereich passen, daher werden verschiedene Axismapper implementiert: NumericalAxisMapper : AxisMapper, TimeAxisMapper : AxisMapper...
Alle diese AxisMapper bieten eine Methode: ProblemToUnits(object val), die die Transformation von Problembereich in Koordinatensystem uebernimmt.
Mein anfaengliches Problem (typunabhaengiges Arbeiten) wird dann durch Casts aufgeloest, z.B.:
abstract class AxisMapper
{
...
public object MinGlobal
{
get
{
return this.minGlobal;
}
set
{
this.minGlobal = value;
}
}
protected object minGlobal;
abstract float ProblemToUnits(object val);
...
}
class TimeAxisMapper : AxisMapper
{
// hier tauchen nun die casts auf. Von Typ object in die jeweilige Problemdomaene.
float ProblemToUnits(object val)
{
temp = (TimeSpan) val;
/* Sollte ich nun beispielsweise auf object MinGlobal, object MaxGlobal..
zugreifen muessen, so werden diese Objekte entsprechend gecastet */
minTemp = (TimeSpan) this.MinGlobal;
maxTemp = (TimeSpan) this.MaxGlobal;
...
return result;
}
}
Der eingefleischte OO/C# - Programmierer moege mich in meinem Ansatz bestaetigen oder kritisieren.
Vorteil scheint mir der, dass diese Klassen einmalig implementiert werden und dann als Aggregation in anderen
Klassen auftauchen.
Besten Dank @blubb: Dein Feedback regt zum Nachdenken an!!
Cheers,
Dr. Goebel