Określenie klasy, z której wywołano metodę

0

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ę?

0

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.

0

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?

0

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

0
public bool Dzialanie(KlasaPierwotna kp) {
	if (kp is Klasa1) {
		return kp.cyfra > 5;
	} else if (p is Klasa2) {
		return kp.cyfra > 5;
	}
}
0

@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.

0

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"?

0

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.

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