Laden...

Abstraktes Property hat in abgeleiteter Kasse einen anderen Typ

Erstellt von Mikexp vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.916 Views
M
Mikexp Themenstarter:in
2 Beiträge seit 2005
vor 17 Jahren
Abstraktes Property hat in abgeleiteter Kasse einen anderen Typ

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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Mikexp,

soweit ich weiß, kann man den Typ einer Property beim Vererben nicht ändern.

herbivore

6.862 Beiträge seit 2003
vor 17 Jahren

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.

1.373 Beiträge seit 2004
vor 17 Jahren

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

1.274 Beiträge seit 2005
vor 17 Jahren

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

M
1.439 Beiträge seit 2005
vor 17 Jahren

Ich habe den Thread zwar nur kurz überflogen, aber du kannst dein Property ja vom Typ object deklarieren.

M
Mikexp Themenstarter:in
2 Beiträge seit 2005
vor 17 Jahren

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

F
10.010 Beiträge seit 2004
vor 17 Jahren

Äh, wie wäre es mit generics?

T
512 Beiträge seit 2006
vor 17 Jahren

Ohne Interface nicht zu empfehlen, weil man sonst im Prinzip die Polymorphie aufgibt.

e.f.q.

Aus Falschem folgt Beliebiges