Ich glaube ich habe einen Denkfehler in meinem Design.
Hier erst mal der fragwürdige Code:
public class BaseManager<T> : IBaseManager<T>, IDisposable where T : class, IComparable<T>
{
protected BaseManager()
{
}
protected BaseManager(string test)
{
//interne Methoden Aufrufen, Properties setzen etc.
}
public static BaseManager<T> Instance(string test)
{
if (String.IsNullOrEmpty(test))
{
throw new ArgumentNullException("test", "Der übergebene test darf nicht leer oder null sein!");
}
// Falls diese Instanz des Managers noch nicht existiert, lege eine neue Instanz an.
if (!cachedInstances.ContainsKey(test))
{
cachedInstances.Add(test, new BaseManager<T>(test));
}
return cachedInstances[test];
}
}
public class SpecialManager : BaseManager<Special>, IManager<Special>, IDisposable
{
public static new SpecialManager Instance(string test)
{
SpecialManager result = BaseManager<Special>.Instance(test) as SpecialManager; // Hier ist result immer null, obwohl eine Instanz zurück kommt . Bei einem direkten Cast eine CastException.
((IManager<Special>)result).wichtigeMethode();
return (SpecialManager)BaseManager<Special>.Instance(connectionstring);
}
}
Wieso kann er das nicht umwandeln (3te Zeile von unten)? SpecialManager erbt doch von BaseManager, also muss er das doch auch umwandeln können.
Kann mir da einer einen Denkanstoß geben oder vielleicht einen Rat/Hinweis?
Hallo,
du kannst einen SpecialManager in einen BaseManager casten, aber nicht umgekehrt so wie du es versuchst.
Baka wa shinanakya naoranai.
Mein XING Profil.
mmmh...Okay.
Aber was ich eigentlich vorhabe ist ja in Stichworten folgendes:*es gibt eine Basisklasse und eine Kindklasse
*die Basisklasse hat eine Instanz
*die Kindklasse soll auch eine Instanz haben
*die Instanz der Kindklasse hat aber keine zusätzlichen Funktionen
kann ich das irgendwie erreichen? Wenn ja wie?
HAllo,
ich weiss nicht genau was du vor hast,
aber theoretisch müsstest du doch einfach nur statt:
SpecialManager result = BaseManager<Special>.Instance(test) as SpecialManager; // Hier ist result immer null, obwohl eine Instanz zurück kommt . Bei einem direkten Cast eine CastException.
((IManager<Special>)result).wichtigeMethode();
return (SpecialManager)BaseManager<Special>.Instance(connectionstring);
das machen:
BaseManager<Special> result = BaseManager<Special>.Instance(test)
((IManager<Special>)result).wichtigeMethode();
return BaseManager<Special>.Instance(connectionstring);
mfg
serial
oh und das habe ich ja noch übersehen... :
public static new SpecialManager Instance(string test)
Das ist absolut BAD STYLE.
Solltest du unter ausschöpfen aller Möglichkeiten korrigieren (gemeint ist das "new" in diesem Kontext).
@serial:
Deine Version würde die Notwendigkeit dieser Methode in der Special-klasse ad absurdum machen.
@serial:
Deine Version würde die Notwendigkeit dieser Methode in der Special-klasse ad absurdum machen.
genau darauf wollte ich hinaus, da
die Instanz der Kindklasse hat aber keine zusätzlichen Funktionen .
mfg
serial
@Jack30lena: das kann sein!
Wäre also gut zu wissen, was genau er vor hat!
Sollte es aber so sein, stimmt deine Aussage natürlich!
mfg
serial
Ich werfe mal das Decorator-Pattern in den Raum, oder bin ich damit auf dem Holzweg?
be the hammer, not the nail!