[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Jak sie dostac do pola dziedziczacej klasy z poziomu dziedziczonej?

bodziec

8/1/2007 6:47:00 PM

Witam.
W programie mam cos takiego ze tworze liste:

List<Bazowa> lista = new List<Bazowa>();

Do tej listy dodaje wszystkie moje dziedziczace klasy czyli:

BazowaA : Bazowa
BazowaB : Bazowa
BazowaC : Bazowa

Piszac dalej program zauwazylem pewien problem. Z poziomu tej listy
potrzebowalbym sie dostac do pól konkretnych klas a nie Bazowa. W
zwiazku z tym ze kazda tabela jest inna i poza dziedziczonymi metodami
i polami ma w sobie cos innego musialem zrobic to na List<Bazowa> zeby
dalo sie tym foreach() przeleciec wszystkie.

Czy jest jakis sposob zeby w tej liscie sie dostac do tych potrzbnych
pol z juz konkretnych tabel? Moze jest jakis kontener do ktorego mozna
wrzucac dowolona ilosc dowolnych obiektow?


Taki kod na szybko w C#:

class Bazowa
{
public Bazowa()
{
}
public virtual void Wykonaj()
{
}
}

class BazowaA : Bazowa
{
public int poleA;

public BazowaA()
: base()
{
}
public override void Wykonaj()
{
}
}

class BazowaB : Bazowa
{
public int poleB;

public BazowaB()
: base()
{
}
public override void Wykonaj()
{
}
}


Dalej mam w programie:

List<Bazowa> lista = new List<Bazowa>;

foreach(Bazowa baz in lista)
baz.Wykonaj();

Dzieki czemus takiem mam dostep do wszystkich wspolnych pol i metod a
nie do oddzielnych klas.

Jak z poziomu lista dostac sie do polaA i poleB ? Wiem ze moglbym te
pola wrzucic do Bazowa i byloby po problemie ale czy jest jakies inne
rozwiazanie? Kontener dowolnych klas?

Pozdrawiam

4 Answers

Pawel Kierski

8/2/2007 7:26:00 AM

0

bodziec w wiadomo?ci <1185994002.278333.170900@22g2000hsm.googlegroups.com> pisze:
> Witam.
> W programie mam cos takiego ze tworze liste:
>
> List<Bazowa> lista = new List<Bazowa>();
>
> Do tej listy dodaje wszystkie moje dziedziczace klasy czyli:
>
> BazowaA : Bazowa
> BazowaB : Bazowa
> BazowaC : Bazowa
>
> Piszac dalej program zauwazylem pewien problem. Z poziomu tej listy
> potrzebowalbym sie dostac do pól konkretnych klas a nie Bazowa.
> [...]

Brniesz w b3?d projektowy. Po to jest klasa bazowa, ?eby z jej
poziomu nie widziea szczególnych implementacji. Klasy dziedzicz?ce
mog? sie zachowywaa ró?nie, ale wygl?daa musz? tak samo. Pytanie: po
co tak naprawde potrzebujesz dostaa sie do pól konkretnych klas?

> Jak z poziomu lista dostac sie do polaA i poleB ? Wiem ze moglbym te
> pola wrzucic do Bazowa i byloby po problemie ale czy jest jakies inne
> rozwiazanie? Kontener dowolnych klas?

Na pewno jest. Ale wtedy w foreach musisz zaczynaa odró?niaa, która
to faktycznie konkretna klasa jest w danym miejscu. I ca3y pomys3 z
klas? bazow? robi sie do bani. Bo skoro masz kontener na dowolne
klasy, niekoniecznie musia3yby bya dziedziczone z jednej.

--
Pawe3 Kierski
news@pkierski.net
dodaj "[nomorespam]" w temacie je?li piszesz z domeny innej ni? .pl,
albo koniecznie chcesz obej?a moje filtry 8-)

bodziec

8/2/2007 8:49:00 AM

0

On 2 Sie, 09:26, Pawel Kierski <n...@pkierski.net> wrote:
> bodziec w wiadomosci <1185994002.278333.170...@22g2000hsm.googlegroups.com> pisze:
>
> > Witam.
> > W programie mam cos takiego ze tworze liste:
>
> > List<Bazowa> lista = new List<Bazowa>();
>
> > Do tej listy dodaje wszystkie moje dziedziczace klasy czyli:
>
> > BazowaA : Bazowa
> > BazowaB : Bazowa
> > BazowaC : Bazowa
>
> > Piszac dalej program zauwazylem pewien problem. Z poziomu tej listy
> > potrzebowalbym sie dostac do pól konkretnych klas a nie Bazowa.
> > [...]
>
> Brniesz w blad projektowy. Po to jest klasa bazowa, zeby z jej
> poziomu nie widziec szczególnych implementacji. Klasy dziedziczace
> moga sie zachowywac róznie, ale wygladac musza tak samo. Pytanie: po
> co tak naprawde potrzebujesz dostac sie do pól konkretnych klas?
>
> > Jak z poziomu lista dostac sie do polaA i poleB ? Wiem ze moglbym te
> > pola wrzucic do Bazowa i byloby po problemie ale czy jest jakies inne
> > rozwiazanie? Kontener dowolnych klas?
>
> Na pewno jest. Ale wtedy w foreach musisz zaczynac odrózniac, która
> to faktycznie konkretna klasa jest w danym miejscu. I caly pomysl z
> klasa bazowa robi sie do bani. Bo skoro masz kontener na dowolne
> klasy, niekoniecznie musialyby byc dziedziczone z jednej.
>
> --
> Pawel Kierski
> n...@pkierski.net
> dodaj "[nomorespam]" w temacie jesli piszesz z domeny innej niz .pl,
> albo koniecznie chcesz obejsc moje filtry 8-)

Problem juz rozwiazany w watku:
http://groups.google.com/group/alt.pl.comp.lang.csharp/browse_thread/thread/7031bcc218b9...

Potrzebuje taka implementacje by nie trzeba bylo wrzucac wszystkich
mozliwych pol do klasy bazowej.
Ostatecznie mam taka implementacje:

forma.Data = ((BazowaA)lista[lista.FindIndex(isBazowaA)]).Data;

gdzie:

private static bool isBazowaA(Bazowa tab)
{
if (tab is BazowaA)
return true;
else
return false;
}

Ciezko to wytlumaczyc na pismie ale znajac caly projekt, to takie
dzialanie ma jak najwiekszy sens i jest tutaj potrzebne.
Dzieki za zainteresowanie problemem i pomoc


mgk

8/3/2007 10:50:00 AM

0

za pomoca abstrakcyjnej metody virtualnej.

Klasa bazowa ma metode virtualna (get-a) abstrakcyjna. I jak
dziedziczysz to przykrywasz ta metode.
Wtedy bazowa moze dostac sie do zmiennej klasy ktora z niej
dziedziczy.

Tylko po co.

samovar

11/21/2011 9:24:00 PM

0

On 21 nov, 16:15, "Mara la Coquine" <antispam.c...@gmail.com> wrote:
> Mara Jade à samovar:
>
> > Quelle bonne idée !
> > Demandez aux Japonais... ils vont vous aider.
>
> Tremblement de terre + Tsunami: 19000 morts et disparus
> Explosion du réacteur de la centrale après passage du ras-de-marée:
> 0 mort, 2 irradiers avec brûlures hospitalisés, et 37 blessés.
>
> En effet...
>

Ben... c'est bien vous qui voulez lancer un projet de pub pro-
nucléaire, non ?
Faudrait être cohérent...

Rv