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!
Ale w czym problem ? Normalnie deklarujesz nowe pole i wystarczy. Żeby pozbyć się warning'a dodaj przed przysłaniającym polem słówko 'new'.
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.
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);
}
}
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
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.