dziedziczenie - przesłonięcie zmiennej

0

Witam
Mam taki problem, że mam klasę bazową i klasę pochodną. Korzystając z zalet polimorfizmu rzutuję sobie klasę pochodną do klasy bazowej i wywołuje sobie odpowiednie metody nie martwiąc się o to który obiekt akurat jest w klasie bazowej. Rzecz jest w tym, że dla wszystkich klas bazowej i pochodnej korzystam z publicznej zmiennej o takiej samej nazwie, ale w jednej klasie potrzebuję w tej samej zmiennej przechowywać dane typu byte[]. Moje pytanie jest takie: jak przesłonić zmienną? Z metodami nie ma problemu, ale nie znalazłem nigdzie informacji o tym jak przesłonić zmienną :( Pliz help!

0

Ale w czym problem ? Normalnie deklarujesz nowe pole i wystarczy. Żeby pozbyć się warning'a dodaj przed przysłaniającym polem słówko 'new'.

0

Słowo new nie rozwiąże mojego problemu. Opiszę dokładniej problem może to pomoże:
Mam klasę bazową:
Class A
{
string str;
...
}
Oraz klasy pochodne:
Class B:A
{...}
Class C:A
{
byte[] str;
}

A także klasę, w której korzystam z powyższych klas:
Class D
{
A a;

if(....)
a = new B();

else
a = new C();

wyswietl(a.str);

wyswietl(string msg)
{....}

wyswietl(byte[] msg)
{....}

}

To nie jest w 100% mój kod, ale chodzi tylko o ideę.
Czyli tworzę sobie obiekt klasy A, a następnie pod pewnymi warunkami tworzę nowy obiekt klasy pochodnej i rzutuję go do klasy bazowej. Problem w tym, że w jednej konkretnej klasie pochodnej potrzebuję tej zmiennej ale innego typu. Jeżeli użyję słowa new to wywołana zostanie zmienna klasy bazowej czyli string, a ja w przypadku kiedy obiekt klasy A zawiera zrzutowany obiekt klasy C potrzebuję zmienną typu byte[] i dlatego też mam przeciążoną metodę "wyswietl" żeby cały proces chodził z automatu.
Mam nadzieję, że opisałem problem dokładnie.

0

Skorzystaj z dziedziczenia.

Np. zrób metodę abstrakcyjną (albo wirtualną):

abstract class A
{
   public abstract void Wyswietl();
   ...
}
class B: A
{
   private string str;
   public override void Wyswietl() { Console.Write(str); }
}
class C: A
{
   private byte[] str;
   public override void Wyswietl() { Console.Write((new ASCIIEncoding()).GetString(str)); }
}
class D
{
   A a;
   ...
   {
      if(....)
         a = new B();
      else
         a = new C();
      a.Wyswietl();
   }
}

Albo zaimplementuj interfejs:

interface IWyswietlany
{
   void Wyswietl();
}
class B: IWyswietlany
{
   private string str;
   public void Wyswietl() { Console.WriteLine(str); }
}
class C:  IWyswietlany
{
   private byte[] str;
   public void Wyswietl() { Console.WriteLine((new ASCIIEncoding()).GetString(str)); }
}
class D
{
   IWyswietlany a;
   ...
   {
      if(....)
         a = new B();
      else
         a = new C();
      a.Wyswietl();
   }
}

Można sporo kombinować, np. coś takiego:

interface IWyswietlany
{
    void Wyswietl(Stream gdzie);
}
abstract class A : IWyswietlany
{
    public abstract void Wyswietl(Stream gdzie);
    ...
}
class B: A
{
   private string str;
   public override void Wyswietl(Stream gdzie) { new StreamWriter(gdzie).WriteLine(str); }
}
class C:  A
{
   private byte[] str;
   public override void Wyswietl(Stream gdzie) { new StreamWriter(gdzie).WriteLine((new ASCIIEncoding()).GetString(str)); }
}
Class D
{
    A a;
   if(....)
      a = new B();
   else
      a = new C();
    wyswietl(a);

    Stream strumien = ...;
    void wyswietl(IWyswietlany wyswietlany)
    {
        wyswietlany.Wyswietl(strumien);
    }
}
0

W sumie myślałem nad tym, żeby zrobić coś w stylu klasy abstrakcyjnej i operować na zmiennych dla konkretnych klas, ale mam już sporą część kodu zrobioną i będę musiał pozmieniać, a myślałem że da się to zrobić w jakiś prostszy sposób. Ale niestety widzę, że lenistwem się nie wykręcę ;)

W każdym razie dzięki, skorzystam z rady :) Pozdrawiam

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