Dostęp do metody z innej klasy

0

Temat dość popularny ale nigdzie nie znalazłem odpowiedzi.
Posiadam metodę w klasie B, która zwraca true or false.
W klasie A w pewnej innej metodzie, chcę wykonać pewne działanie, zależne od tego czy wartość to true czy false ( z metody w klasie B).
Niestety nie mogę uczynić tej metody statyczną, a stworzenie gettera również jest niemożliwe - odpowiedz IDE - no fields without getter were found.

Pomyślałem żeby stworzyć nowy obiekt klasy B, w klasie A i na tym obiekcie wywołać metodę która zwraca true or false, jednak wszytko sie crashuje.
Czy ten ostatni pomysł jest dobry ? Zastanawiam się czy się nie nadaje czy problem jest w innym miejscu. Są jeszcze jakieś inne sposoby ?
Niestety nie mogę wrzucić kodu, jeżeli za mało informacji dajcie znać.

0

jak klasa B jest używana tylko przez klasę A to możesz zrobić klasę B w klasie A jako wewnątrzną.

Ze wzroców projektowych to wg mnie pasuje tu wzorzec proxy.

1

Wrzuć kod albo opisz bardziej. Albo wrzuć przykład takiego kodu zmodyfikowany. Bo to wygląda na bardzo prymitywny i prosty problem a Ty kombinujesz.
I wrzuc ten kod i nie bój sie o jakiś przypał czy plagiat bo metoda która zwraca boolean w klasie A a w klasie B to w kazdym systemie takie są metody

0

wiec tak:

w klasie B mam metodę i zmienna prywatna


private Car fiat;


public boolean trueOrFalse() {
return fiat.metodaZKlasyCar();
 }

Nie mogę zrobić fiata publicznego bo wszystko się sypie.

więc jak teraz zrobić w klasie A, coś w stylu:

if (trueOrFalse==true) 
zrobCosTam()

Zawsze ustawiałem wszystko statyczne i działało. Teraz ten sposób odpada.

3

Zacznijmy może od tego zebyś rozróżniał KLASĘ od OBIEKTU. Napisz konkretnie co próbujesz zrobić, bo teraz to co opisujesz nie ma zadnego sensu.
W prawdziwym życiu w OBIEKCIE klasy A miałbyś dostęp do OBIEKTU klasy Car albo klasy B i z niego zwyczajnie korzystał.

3

Kolega prawdopodobnie próbuje wywołać metodę klasy A nie mając do dyspozycji jej obiektu... Więc i wszystko się koncertowo sypie.
Jeśli chcesz wywołać w klasie metodę zaimplementowaną w innej klasie, to potrzebujesz stworzyć w pewnym miejscu obiekt klasy, której metodę starasz się wywołać.

Mimo wszystko, przydałby się szerszy kontekst i dokładniejszy, techniczny opis tego co dokładnie chcesz zrobić, co robisz w rzeczywistości i ew. treść błędu, którym pluje kompilator/interpreter oraz swoje rozumienie tematu.

W ten sposób łatwiej wytłumaczyć kwestię, która Ci umyka.

0

więc w klasie A tworzę obiekt klasy B

Car cr = new Car();
i na tym obiekcie wywłuje metodę
cr.metodaZKlasyCar();

tak to się w teorii robi ?

2

Nie. Robi sie to z głową a nie przez jakieś losowe permutacje kodu. Prawie nigdy nie robi się tego jak pokazałeś wyżej, bo zwykle chcesz w aplikacji mieć zestaw obiektów na których pracujesz a nie tworzyć za każdym razem nowe.
To trochę tak jakbyś miał samochód w garażu, ale za każym razem kiedy chcesz gdzieś jechać kupujesz nowe auto, zamiast wziać to które już masz. Sensu w tym nie ma, niemniej technicznie rzecz biorąc "będzie działać".

0

więc proszę o kolejną podpowiedź, jak udostępnić ten sam obiekt do innej metody ?

3

Ziomek, przecież to są podstawy. Wróć do podręcznika i poczytaj jeszcze raz o programowaniu obiektowym, wystarczy pierwszy rozdział. Sposobów na przekazanie obiektu jest wiele i stosuje się w zależności od konkretnej sytuacji. To Ty powinieneś wiedzieć, który sposób w Twojej sytuacji będzie odpowiedni.

  1. Tworzysz obiekt klasy A w klasie B.
  2. Przekazujesz referencję obiektu klasy A do konstruktora klasy B
  3. Piszesz setter w klasie B, do którego przekazujesz referencję obiektu klasy A
  4. Miksujesz 2 i 3 sposób.
0

szukałem w książce Java Podstawy i nie znalazłem ;/
Próbowałem 1 sposób i nie działa, gettery/settery tez odpadają, podobnie jak ustawienie tego wszystkiego statycznym. Prosiłbym o przedstawienie 2 punktu na moim przykładzie bo chyba jeszcze nie próbowałem.

4

@hipster tak tak, 500 stron na temat javy ale o tym jak działa konstruktor czy settery nie bylo :D Może ci sie książki pomylily i czytałeś Dzieci z Bullerbyn zamiast tego o Javie? Moje zalecenie: odpuść z programowaniem, to nie jest dla ciebie. Nie trać czasu tylko spróbuj czegoś innego -> może spawacz? może piekarz?
Anyway wątek zaraz poleci do kosza bo kolejny raz piszesz nie działa ale nie pokazujesz KODU KTÓRY CI NIE DZIAŁA. Idź może na forum dla wróżek?

1
public class A{
    private B bObject;

    public A(B bObject){
        this.bObject = bObject;
    }
}

class B{

}
0
Shalom napisał(a):

zwykle chcesz w aplikacji mieć zestaw obiektów na których pracujesz a nie tworzyć za każdym razem nowe.

Czyli nie używasz nigdy lokalnie utworzonych obiektów klasy? Bo nie bardzo rozumiem co masz na myśli. A jak ci potrzebny tylko raz, to tez nie?

1

@Trzeźwy Szczur no gdzieś obiekty tworzyć musisz, czasem oczywiście także lokalnie. Ale robienie akcji w stylu:

x = new X();
x.metoda();
// dalej juz nie używamy x

to zwykle WTF i rypnięty design

0
Shalom napisał(a):

@Trzeźwy Szczur no gdzieś obiekty tworzyć musisz, czasem oczywiście także lokalnie. Ale robienie akcji w stylu:

x = new X();
x.metoda();
// dalej juz nie używamy x

to zwykle WTF i rypnięty design

y = new X().metoda()

I dalej używamy y. Jeśli to dla ciebie dalej "rypnięty design" (zwłaszcza, gdy klasa X nie jest twoja), to przyznam że nie rozumiem.

0

No oczywiście że to rypnięty design, chyba że ewentualnie X to builder, albo to jest jakiś szczególny side effect (pisanie do pliku np.). Jest to równie sensowne co dziedziczenie z jakiejś klasy po to zeby móc gdzieśtam wywoływać z niej metody.

0

Czasem musisz skorzystać z jednej metody klasy, której nie możesz zmodyfikować, jak np wspomiane pisanie do pliku, albo pokazanie nowego Acttivity (android) itd. Twierdzenie (ogólne), że tworzenie obiektu klasy po to żeby skorzystać z metody tej klasy to "zrypany design" jest co najmniej troche na wyrost, nie sądzisz?

Shalom napisał(a):

Jest to równie sensowne co dziedziczenie z jakiejś klasy po to zeby móc gdzieśtam wywoływać z niej metody.

Czyli jeśli moja klasa rozszerza inną i potem robi coś w Override to jest zrypany design?

public class MainActivity extends AppCompatActivity
    {

    @Override
     protected void onCreate(Bundle savedInstanceState)
     {
      ///****************
     }
}

Zrób to inaczej, przy założeniu że nie masz dostępu do modyfikacji klasy bazowej.

0

@Trzeźwy Szczur nie chodzi tu o sytuacje kiedy faktycznie robisz klasę ma rozszerzać inną klasę, tylko kiedy dziedziczysz bo jakaś klasa ma fajną metodę którą chciałbyś sobie wywołać, mimo że twoja klasa z tamą nie ma nic wspólnego.

(dla jasności, do razu mówie że mixin/trait to inna bajka, bo dołączasz samą metodę, a nie jakąś klasę domenową)

0
Trzeźwy Szczur napisał(a):

Czyli jeśli moja klasa rozszerza inną i potem robi coś w Override to jest zrypany design?

Piszesz bzdury, nie na temat. @Shalom odpowiadał w konkretnym kontekście tego konkretnego wątku. Z postów autora wątku wynika, że to on jest autorem obu klas i może swobodnie je projektować, więc jak najbardziej ma prawo krytykować design. Poza tym nie wiem co ma wspólnego dziedziczenie z przekazywaniem obiektu do innej klasy. Ten argument jest z d**y.

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