Hallo!
Ich hab folgendes Problem:
In der abstrakten Basisklasse hab ich ein (abstraktes) Property. In den abgeleiteten Klassen hat dann dieses Property einen ganz speziellen Typ... Wie bekomme ich das jetzt aber in der Basisklasse so hin, dass er das akzeptiert?! Hier ein kleines Beispiel:
public abstract class Vaterklasse
{
...
public abstract TypAllgemein Settings { get; set;}
...
}
public class Kindsklasse_01: Vaterklasse
{
...
public override SpeziellerTyp Settings
{
...
}
}
Das Problem ist, dass ich ja erst in der abgeleiteten Klasse weiss, von welchem Typ das Property Settings sein muss... Welchen Typ muss ich also in der Vaterklasse beim abstrakten Property angeben?
Dafür gibt es sicher eine Lösung?
Besten Dank für die Hilfe!
Gruss Mike
Gruss, Mike
Hallo Mikexp,
soweit ich weiß, kann man den Typ einer Property beim Vererben nicht ändern.
herbivore
Glaube du versuchst abstrakte Klassen falsch einzusetzen. Abstrakte Klassen geben dir ja ein Grundgerüst vor, dass die Kindsklassen mit Funktionalität füllen müssen. Ändern können die Kindsklassen aber nichts daran was für Funktionen es gibt aus der abstrakten Klasse(außer sie führen natürlich neue Funktionen ein). Sprich wenn du ne Funktion GetXYZ mit Rückgabeparameter int in der abstrakten Klasse hast, muss sie auch genauso in der abgeleiteten Klasse sein.
Baka wa shinanakya naoranai.
Mein XING Profil.
Hallo,
Wenn SpeziellerTyp von TypAllgemein abgeleitet ist, versucht Mikexp etwas, das von der Idee her Sinn macht: sogenannte kovariante Rückgabetypen. Da ein SpeziellerTyp immer auch ein TypAllgemein ist, wäre es vollkommen in Ordnung, wenn eine spezialisierte Klasse auch einen spezialisierteren Rückgabetypen für die Property anbieten würde. Das ganze geht allerdings natürlich nur beim getter! Beim setter könnte man im Gegenzug nur Kontravarianz verwenden, also dass der übergebene Typ in der Basisklasse, die die Property definiert spezieller ist als in der abgeleiteten Klasse.
Beim getter müsste C# also Kovarianz, beim setter Kontravarianz unterstützen. Da C# aber nur einen Typ für die gesamte Property zulässt, ist das ganze ziemlich unmöglich. Leider unterstützt C# aber auch keine Kovarianz bei Rückgabetypen von Funktionen. Das hier ist also nicht möglich, obwohl es perfekt! Sinn macht:
class UserBase {
public astract UserBase Clone();
}
class UserDerived : UserBase{
public override UserDerived Clone() {
return new UserDerived ();
}
}
// Verwendung:
static void Main() {
UserDerived derived = new UserDerived();
UserDerived derivedClone = derived.Clone(); //ok
UserBase baseClone = derived.Clone(); //ok
UserBase userBase = derived; // ok
baseClone = userBase.Clone(); // ok
}
Wie gesagt: geht leider nicht.
C# unterstützt Ko- und Kontravarianz gegenwärtig nur bei Delegaten.
http://msdn2.microsoft.com/de-de/library/ms173174.aspx
Grüße,
Andre
Wenn es sich bei den Typen um Klassen handelt dann Implementiere statt einer Klasse (TypAllgemein ) ein Interface, dann kannst du diese Eigenschaft ein Klassenobjekt zuweisen.
"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein
Ich habe den Thread zwar nur kurz überflogen, aber du kannst dein Property ja vom Typ object deklarieren.
Hallo VizOne
Besten Dank für deine "Schützenhilfe"...😉
Wirklich schade, dass das nicht geht, ich versuche mal den Tipp mit dem Interface!
Vielen Dank für eure Hilfe, Gruss Mike
Gruss, Mike
Ohne Interface nicht zu empfehlen, weil man sonst im Prinzip die Polymorphie aufgibt.
e.f.q.
Aus Falschem folgt Beliebiges