Zmienna metoda klasy

0

Chciałbym zrobić coś na zasadzie "zmiennej funkcji". Gdy tworzę obiekt jakiejś klasy Klasa, chciałbym aby jedną z metod można było zmieniać tak, że w każdym z obiektów będzie wykonywała inne polecenia.

class Klasa{
	private int i = 8;
	private String name = "coś coś tam"; // jakieś tam właściwości

	public void czynnosc() // metoda taka sama dla każdego obiektu
	{
		...
	}

	public void use() // chciałbym, aby tę funkcję można było zmieniać dla każdego obiektu oddzielnie
	{
	}
}

Sam nie wiem, jak dokładniej opisać, o co mi chodzi.

Klasa klasa = new Klasa();
klasa.use() = new function(
			...
			);

Coś na tej zasadzie. Wątpię, aby coś takiego istniało, ale warto sprawdzić :)

4

Zastanów się czy nie wystarczy zastosować wzorca strategii. Jeżeli jednak nie to:

  1. Tworzysz interfejs i w nim metodę która ma taką sygnaturę jaką chcesz mieć w tej dynamicznej metodzie.
  2. Tworzysz klasę która ma pole typu tego interfejsu i metodę która wywołuje metodę z tego pola.
  3. Tworzysz klasę i ustawiasz implementację dla niej przez klasę anonimową lub wyrażenie lambda w java 8.
    Musisz też zadecydować co robić jeżeli nie ustawisz funkcji a będziesz ją chciał wywołać.

Alternatywnie - użyj innego języka w którym można dynamicznie dodawać pola i metody do klasy :).

0

@gryguc jak dla mnie to wygląda na różne klasy z różnymi implementacjami metody use(), które dziedziczą po wspólnej klasie, która ma zdefiniowaną czynnosc() i abstrakcyjną use().

0

Coś na wzór delegaty, tak szybkim okiem rzucając.

2

Może o takie coś ci chodzi?

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

abstract class BaseFoo {
	public abstract void DoSomething();
}

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		BaseFoo foo1 = new BaseFoo() {
			@Override
			public void DoSomething() {
				System.out.println("aaaa");
			}
		};
		BaseFoo foo2 = new BaseFoo() {
			@Override
			public void DoSomething() {
				System.out.println("bbbb");
			}
		};
		foo1.DoSomething();
		foo2.DoSomething();
	}
}

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