zwracany typ różna w klasie bazowej i pochodnej

0

Cześć,
mam pytanie. Czy w C# można w jakiś sposób zrobić coś takiego?:

class KlasaBazowa
{
  public abstract object X
  {  get;  }
};

class KlasaPochodna : Bazowa
{
  private int x;
  public override int X
  {  get { return x; }  }
};
 

Chodzi o to, że w klasie bazowej typ zwracanej wartości danej funkcji(w tym wypadku właściwości) byłby inny niż w klasie pochodnej. Pomyślałem, że skoro w C++ można użyć wskaźników i klas pochodnych, to w C#, jako że wszystko dziedziczy po object, powyższe rozwiązanie zadziała. Tak jednak nie jest. Czy zna ktoś rozwiązanie mojego problemu?
Z góry dzięki
Pozdrawiam

0
abstract class KlasaBazowa
{
  public abstract object X
  {  get;  }
};
 
class KlasaPochodna : KlasaBazowa
{
  private int x;
  public override object X
  {  get { return (object)x; }  }
};

jaki sens miałaby zmiana zwracanego typu? przecież jeśli użyty typ dziedziczy po bazowym, to można użyć rzutowania (nawet niejawnego) i zwracać typ bazowy.

1

Po pierwsze, po definicjach klas nie stawia się średników.
Po drugie, metodę abstrakcyjną można umieszczać tylko w abstrakcyjnej klasie.
Po trzecie:

class KlasaBazowa
{
    public object X
    {
        get { return null; }
    }
}

class KlasaPochodna : KlasaBazowa
{
    private int x;
    public new int X 
    { 
        get { return x; } 
    }
}
Azarien napisał(a):

jaki sens miałaby zmiana zwracanego typu? przecież jeśli użyty typ dziedziczy po bazowym, to można użyć rzutowania (nawet niejawnego) i zwracać typ bazowy.

Tylko, że typ bazowy nie posiada wszystkich metod i właściwości typu pochodnego.

Jaki sens? Przykład praktyczny: w ASP.NET WebForms, wszystkie strony dziedziczą z klasy Page (podobnie jak w WinFormsach wszystkie okienka dziedziczą z Form), która ma właściwość Master typu MasterPage zwracającą master page (taki szablon) danej strony. Przy czym, jeśli robisz swoją stronę master page, to dziedziczysz z MasterPage, więc masz już klasę MySuperMasterPage. I co teraz, jeśli chcemy mieć klasę bazową wszystkich stron inną niż Page, zwracającą pod nazwą Master nie zwykłe MasterPage lecz MySuperMasterPage? Modyfikator new przychodzi tutaj z pomocą.

0

dzięki wielkie, właśnie o to mi chodziło:)

0

Chyba nie rozumiem idei koncepcji założeń...

założenie I: w C++ class od struct różni się TYLKO domyślnym poziomem dostępu do elementów: odpowiednio private i public.
założenie II: do struktur z C dodajemy metody (i konstruktory, destruktory), dziedziczenie i całą resztę.
założenie III: klasa, która ma tylko pola, nie ma metod (zwłaszcza wirtualnych), i nie dziedziczy po niczym — jest po prostu znaną z C strukturą.

poniał? ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1