Następujące zagadnienie: w jakiejś klasie chciałbym mieć metodę, która będzie wywoływana z dwóch innych klas, posiadających zmienną o tej samej nazwie. Metoda będzie wykonywać działanie na zmiennej, więc powinna rozróżniać, z której klasy została wywołana i wykorzystywać zmienną określoną w klasie wywołującej. Czy istnieje sposób na określenie klasy, z której wywołano metodę?
Jeśli ma rozróżniać dlatego, że metoda w zależności od tego, czy przyjmuje zmienną z klasy a, czy b wykonuje inne działanie to powinieneś mieć np. 2 różne metody.
Jeśli ma robić dokładnie to samo, to nie musisz wiedzieć z której klasy jest zmienna, którą przekazujesz.
Ma rozróżniać dlatego, że zmienna ma inną wartość w jednej klasie, a inną w drugiej. Działanie na zmiennych ma wykonywać to samo. Pokażę na takim prostym przykładzie:
public class Main
{
Klasa1 klasa1;
Klasa2 klasa2;
public static void main(String[] args)
{
Main test = new Main();
test.dzialaj();
}
public void dzialaj()
{
klasa1 = new Klasa1(this);
klasa2 = new Klasa2(this);
klasa1.wykonaj1();
klasa2.wykonaj2();
}
public boolean dzialanieDlaKlasa1()
{
if (klasa1.cyfra > 5)
{
return true;
}
else
{
return false;
}
}
public boolean dzialanieDlaKlasa2()
{
if (klasa2.cyfra > 5)
{
return true;
}
else
{
return false;
}
}
}
public class Klasa1
{
Main main;
int cyfra;
public Klasa1(Main main)
{
this.main = main;
}
public void wykonaj1()
{
cyfra = 4;
if (main.dzialanieDlaKlasa1())
{
System.out.println("cyfra = " + cyfra + ". Jest większa od 5");
}
else
{
System.out.println("cyfra = " + cyfra + ". Jest mniejsza lub równa 5");
}
}
}
public class Klasa2
{
Main main;
int cyfra;
public Klasa2(Main main)
{
this.main = main;
}
public void wykonaj2()
{
cyfra = 7;
if (main.dzialanieDlaKlasa2())
{
System.out.println("cyfra = " + cyfra + ". Jest większa od 5");
}
else
{
System.out.println("cyfra = " + cyfra + ". Jest mniejsza lub równa 5");
}
}
}
W tym przykładzie działanie jest wykonywane w dwóch metodach klasy Main. Jak zrobić, żeby te dwie metody zastąpić jedną, wykorzystującą zmienną z metody wywołującej? Teoretycznie mógłbym np. zadeklarować Stringa klasaWywolujaca, w Klasie1 przypisać mu wartość "Klasa1", analogicznie postąpić w Klasa2, a w jednej metodzie klasy Main sprawdzać, jaką String ma wartość i wtedy działać na zmiennej odpowiedniej klasy. Może jednak jest jakiś inny sposób?
jeśli się nie mylę, to chodzi ci o wzorzec projektowy "strategy", pogoogluj trochę, jest to jeden z najprostszych i chyba najczęściej używanych wzorców projektowych
public bool Dzialanie(KlasaPierwotna kp) {
if (kp is Klasa1) {
return kp.cyfra > 5;
} else if (p is Klasa2) {
return kp.cyfra > 5;
}
}
@Wybitny Pomidor twój przyklad jest totalnie bez sensu bo wewnatrz Klasa1 to ty wiesz doskonale gdzie jesteś i jaki kod masz wykonać. Te boolowskie metody w main w ogóle nie są potrzebne i tak samo te ify w wykonaj() nie są potrzebne, więc ja w ogóle nie rozumiem w czym jest problem.
Shalom, post z godziny 00:35 nie był mój. Bez logowania się, system pewnie przypadkowo przydzielił tę samą nazwę użytkownika innej osobie. Przedstawiony przeze mnie przykład rzeczywiście jest pokręcony, nieudolnie chciałem przedstawić problem opisany w moim pierwszym poście. Spróbuję inaczej to przedstawić:
public class Test
{
Klasa1 klasa1;
Klasa2 klasa2;
int cyfra;
public Test (Klasa1 klasa1, Klasa2 klasa2)
{
this.klasa1 = klasa1;
this.klasa2 = klasa2;
}
public void dzialaj()
{
if (wywołanie tej metody nastąpiło z Klasa1)
{
cyfra = klasa1.cyfra;
}
else if (wywołanie tej metody nastąpiło z Klasa2)
{
cyfra = klasa2.cyfra;
}
System.out.println("Cyfra = " + cyfra);
}
}
W nawiasach ifów napisałem, co powinno być sprawdzane. Zmienna cyfra ma inną wartość w Klasa1 i inną w Klasa2. W metodzie "dzialaj" zmienna cyfra powinna przyjmować wartość taką jak w klasie wywołującej tę metodę.
Czy istnieje jakiś prosty sposób, aby sprawdzać z jakiej klasy była wywołana metoda "dzialaj"?
Robisz to źle. Operacje związane z "działaj" powinny być w Klasa1 i Klasa2 które implementują interfejs z metodą działaj(). Nie ma wtedy żadnego problemu, żadnej ifologii ani nic. Klasyczny wzorzec Strategy.