Laden...

Denkfehler bei Vererbung?

Erstellt von Froggie vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.281 Views
F
Froggie Themenstarter:in
323 Beiträge seit 2007
vor 13 Jahren
Denkfehler bei Vererbung?

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?

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

du kannst einen SpecialManager in einen BaseManager casten, aber nicht umgekehrt so wie du es versuchst.

Baka wa shinanakya naoranai.

Mein XING Profil.

Gelöschter Account
vor 13 Jahren

aber nicht umgekehrt so wie du es versuchst

Doch kann man (schlechter stil), wenn der Basemanager in wahrheit bereits ein Specialmanager ist.

Folgende Zeile ist also der Knackpunkt:


new BaseManager<T>(test)
F
Froggie Themenstarter:in
323 Beiträge seit 2007
vor 13 Jahren

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?

S
902 Beiträge seit 2007
vor 13 Jahren

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

Gelöschter Account
vor 13 Jahren

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.

S
902 Beiträge seit 2007
vor 13 Jahren

@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

Gelöschter Account
vor 13 Jahren

@serial:
Die sinnigste Vermutung ist, das er den Typ zur Fallunterscheidung heranzieht aber dennoch mit Polymorphie arbeiten möchte. (was nebenbei bemerkt ebenfalls bad style ist)

.

S
902 Beiträge seit 2007
vor 13 Jahren

@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

458 Beiträge seit 2007
vor 13 Jahren

Ich werfe mal das Decorator-Pattern in den Raum, oder bin ich damit auf dem Holzweg?

be the hammer, not the nail!