Wielowątkowość a dostęp do elementów klasy nadrzędnej.

0

Witam, mam taki problem: mam klasę, np. Main i klasę Foo która implementuje Runnable (czyli tworzony jest nowy wątek) i jednocześnie dziedziczy po Main:

public class Foo extends Main implements Runnable {
//costam
    public void run() {
        //costam
    }
}

W klasie Main mam obiekt "PoleTekstowe". Jeżeli zrobię coś takiego w klasie Main

PoleTekstowe.setText("blabla");

to wszystko zadziała, w podanym polu pojawi się napis "blablabla". Jeżeli jednak to zrobię w klasie Foo to niestety (mimo że dziedziczy po Main) nic takiego nie nastąpi. Gdzie popełniam błąd?

Dodam że chciałem zrobić jakąś dodatkową klasę "Log", którą bym po prostu tworzył

new Log("Połączono.");

i w podanym polu tekstowym poprzez konstruktor klasy Log umieszczałbym tekst, jednak klasa Log nie ma dostępu do pola "PoleTekstowe" (mimo że jest publiczne) a nawet gdy dziedziczymy po klasie Main to mimo że jest dostęp do tego pola i wszystko się kompiluje to ta operacja nie działa podobnie jak w powyższym przypadku z wielowątkowością.

Pozdrawiam

4

o_O Boże widzisz a nie grzmisz!
Lekcja na dziś: KLASY to zupełnie co innego niż OBIEKTY tych klas.
Ty chciałbyś powiązać OBIEKT klasy Main z OBIEKTEM klasy Foo, a nieudolnie próbujesz powiązać KLASĘ Foo z KLASĄ Main.
Publiczne pole OBIEKTU klasy oznacza tylko tyle że mając dostęp do OBIEKTU danej klasy możesz się bezpośrednio odnosić do tego pola.

Historyjka poglądowa:
Klasa określa pewien abstrakcyjny "typ" obiektów które w jakiś sposób są do siebie podobne. Na przykład takim typem może być "Krzesło". Możemy mówić o kolorze krzesła, jego wysokości, materiale z jakiego krzesło wykonano itd. Zauważ jednak że nie mam na myśli w tej chwili żadnego konkretnego krzesła, mówię tylko o tym jakie parametry takie Krzesło ma. Ale zauważ że póki nie będę miał krzesła to nie bardzo mogę cokolwiek powiedzieć o jego kolorze, nie mogę też złamać mu nogi.
Relacja dziedziczenia pozwala nam definiować pewną hierarchię obiektów - to jest relacja "jest szczególnym przypadkiem". Mogę zdefiniować klasę KrzesłoObrotowe które dziedziczyć będzie z Krzesła, bo KrzesłoObrotowe jest szczególnym przypadkiem Krzesła. Takie KrzesłoObrotowe ma pewne wewnętrzne mechanizmy - jakieś hydrauliczne zabawki w środku, którymi można pośrednio sterować za pomocą różnych wajch i pokręteł (to są pola prywatne którymi moge sterować za pomocą metod).
Jeśli teraz kupię sobie konkretne krzesło (czyli konkretny OBIEKT) to będę mógł powiedzieć że to krzesło ma pewien kolor i będę mógł sobie pokręcić wajchami.

A teraz wyobraźmy sobie że chciałbym usiąść sobie na krześle i je sobie wyregulować. Normalny człowiek kupiłby krzesło, usadził na nim tyłek i bawił się wajchami. Tak zrobiłby normalny czlowiek.
A co zrobiłby @MateuszS? Zrobiłby z siebie Cyborga - pół-Człowieka, pół-Krzesło i następnie majstrował w tych hydraulicznych mechanizmach które normalnie siedzą w krześle (a teraz też w koledze @MateuszS bo zamontował sobie takie coś zamiast jednej nogi). A następnie dziwiłby się czemu krzesło które stoi w pokoju wcale się nie reguluje. Podkreślam: kolega @MateuszS wcale nie usiadł na tym krześle! On zamiast tego zrobił z siebie Człowieka-Krzesło po to żeby mieć dostęp do wajch i pokręteł. Problem w tym że jedyne wajchy do których ma dostęp to te które ma teraz wbudowane w siebie, a nie te w krześle które stoi w pokoju.

0

Nie grzmi bo nie istnieje.
Zle mnie zrozumiales. W php, c++ itd jesli mamy pola publiczne w klasie glownej to klasy dziedziczace moga z nich korzystac.

2

Dobrze Cię zrozumiał. Masz dwa różne obiekty, więc masz dwa różne pola tekstowe.
Od kiedy w C++ jak zrobisz tak:

Klasa ob1, ob2;
ob2.ZmienCos();

to w ob1 też się coś zmieni?
Nie znasz różnicy między klasą a jej instancją/obiektem?

Przy wielowątkowości dochodzi jeszcze problem z EDT(Event Dispatch Thread) - poczytaj o tym i jak się powinno ze swingiem postępować w aplikacjach wielowątkowych.

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