Kopozycja/Delegacja odpowiedzialność/HAS-A

0

Witam,

Mam problemy nad zrozumieniem terminow wymienionych w teamcie.

Wstępnie moja propozycja kodu.

class Company {
	
	private  int sallary = 2000;
	
    public void setPodwyżka(int kwota){
    	
       sallary =+ kwota;
       System.out.println(sallary);
    }
   

	
}



class Worker {
	
	private Company comapny;
	
    public void salaryRais(){
		 comapny.setPodwyżka(300);
	}
}



public class Struktura{
	
	public static void main(String[] args){
		
	Worker work = new Worker();
	work.salaryRais();
		
	}
	
}

Dalej nie działa, ale bardziej pasuje z teorią, czyli , ze pewna klasa A to częśc całośći klasy B ;p

class Company {
	
   
    public int setPodwyzka(int salary, int podwyzka){
    	return salary + podwyzka;
    }

	
	
}



class Worker {
	
	private Company comapany;
	private int salary = 1000;
	
    public void salaryRais(){
		salary = comapany.setPodwyzka(salary, 300);
		System.out.println(salary);
	}
}



public class Struktura{
	
	public static void main(String[] args){
		
	Worker work = new Worker();
	work.salaryRais();
		
	}
	
}
0

Zastanow sie: czy firma dostaje podwyzke? Czy pracownik sklada sie z firmy? Czy moze pracownik dostaje podwyzke, a firma sklada sie z pracownikow?

0

Nie wiem co ten twój kod ma robić, ale chyba przechodzisz z C++ na Javę, skoro oczekujesz że "Company company;" stworzy ci nową instancję klasy Company. W Javie są tylko prymitywy oraz referencje do obiektów, nie ma przekazywania obiektów przez wartość ani referencji do prymitywów (nieopakowanych), a do każdej referencji trzeba (pośrednio lub bezpośrednio) wpisać wynik operatora new.

Tak, że powinno być "Company company = new Company();" albo zrób i użyj konstruktora klasy Worker, który tą zmienną zainicjalizuje.

0

Aha, isallary =+ kwota;czy na pewno o to chodzi?

0

Przykład pokazuje, że właśnie nie rozumie tego terminu jak kompozycja. Ktoś mogłby podać przykład i wtłumaczyć o co w tym chodzi ? Google nie dał mi żadnych sensowych materiałów.

0

interface Silnik {
    void start();
}

class ZejebistySilnik implements Silnik {
    public void start() {
        System.out.println("Wwwrrr wrrrrr!");
        System.out.println("Wwwwwwwwiuuuuuuuuuuąąąąą!");
    }
}

class StarySilnik implements Silnik {
    public void start() {
        wlaczSsanie();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException exc) {
             // ignore
        }
        System.out.println("Pyr pyr pyr.");
    }
    private void wlaczSSanie() {
        System.out.println("Ślup ślup ślup...");
    }
}


interface Samochod {
    void jedz();
}

abstract class AbstractSamochod implements Samochod {
    private Silnik silnik;

    public AbstractSamochod(Silnik silnik) {
        this.silnik = silnik;

        public void jedz() {
            silnik.start();
        }
    }
}

class BMWz8 extends AbstractSamochod {
    public BMWz8(Silnik silnik) {
        super(silnik);
    }
}

class Maluch extends AbstractSamochod {
    public Maluch(Silnik silnik) {
        super(silnik);
    }
}

public class Main {
    public static final main(String[] args) {
Samochod s = new BMWz8(new ZajebistySilnik());
s.jedz();

s = new Maluch(new StarySilnik());
s.jedz();

s = new Maluch(new ZajebistySilnik());
s.jedz();
}

Powyzej masz kompozycje (has-a), oraz dziedziczenie (is-a), pokazany polimorfizm (s.jedz()), kodowanie do interfejsow i cholera wie co jeszcze.
Is-a: i BMW i Maluch sa samochodami, wiec oba mozna przypisac do referencji Samochod, i na obu mozna wykonwac metode jedz() zdefiniowana w interfejsie Samochod.
Is-a: ZajebistySilnik i StarySilnik sa Silnikami, oba mozna przypisac do referencji na Silnik i na obu mozna wywolac metode start(). Dzieki temu mogles utrozyc malucha z zajebistym silnikiem, oraz mozesz utworzyc BMW ze starym silnikiem (zauwaz ze uzywam w konstruktorze Silnik, czyli klase / interfejs bazowy.
Has-a: wszystkie samochody maja jakiestam silniki (chyba), wiec aby Samochod mogl pojechac musisz mu zapodac silnik ktorego bedzie uzywac.
Kodowanie do interfejsow: pozwala na tworzenie roznych wariantow obiektow, jak np super-maluch lub kijowy bmw (mozesz podmieniac silniki).
Polimorfizm - majac referencje na samochod, mozesz przypisac do niej jakikolwiek samochod (wazne aby byl implementowany konkretny interfejs). Jak wywolasz na takiej referencji metode jedz() to automatycznie bedzie wolana metoda odpowiedniej podklasy. W przypadku silnika widac to tutajnajlepiej: masz referencje na silnik, i dla BMW z super silnikiem otrzymasz tylko 2 linijki tekstu, natomiast dla jakiegokolwiek samochodu ze starym silnikiem otrzymasz linijke ze musi zassac, odczeka minute i dopiero popyrka z miejsca. I wszystko automatycznie.
Masz to dosc informacji na nastepny tydzien pewnie, powodzenia.

Disclaimer: kod pisalem bez IDE z biegu, wiec moze miec bledy jesli bedziesz chcial(a) przekleic.

0

Dzięki za wytłumaczenia.

Uproszczę trochę przykład kompozycji. import java.util.ArrayList;
import java.util.List;

public class Kolekcja {

public static void main(String[] args) {
    List<Biblioteka> lista = new ArrayList<Biblioteka>();
    
    
    lista.add(new Osoba("imie", "nazwisko"), "Tytułek");
}

}
class Biblioteka{
private Osoba autor;
private String tytul;

public Biblioteka(Osoba autor, String tytul) {
	super();
	this.autor = autor;
	this.tytul = tytul;
}
public Osoba getAutor() {
	return autor;
}
public void setAutor(Osoba autor) {
	this.autor = autor;
}
public String getTytul() {
	return tytul;
}
public void setTytul(String tytul) {
	this.tytul = tytul;
}

}


A teraz pytanko ;p Jak dodać to do kolekcji ? :)
0
class Osoba {
	private String imie;
	private String nazwisko;

	public Osoba(String imie, String nazwisko) {
		super();
		this.imie = imie;
		this.nazwisko = nazwisko;
	}

	public String getImie() {
		return imie;
	}

	public void setImie(String imie) {
		this.imie = imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		this.nazwisko = nazwisko;
	}

}

zjadło kawałek kodu :)

0

Tworzysz liste bibliotek a probujesz dodac osobe, dlatego nie dziala.

lista.add(new Biblioteka(new Osoba("imie", "nazwisko"), "Tytułek"));

0

Dziękuje :)

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