Wątek przeniesiony 2016-05-20 11:31 z Java przez ŁF.

tworzenie obiektów i powiązania z klasami

0

3 klasy: __Kasa, Paragon i Pozycja. __ oraz główna o nazwie Main

I ogolnie w klasie main tworze obiekt klasy Kasa , i nie wiem jak polaczyc zeby paragony byly tworzone przez klase Kasa?? czyli dodawane do Kasy.

public class Kasa {
	private String nip;
	private String nazwa;
	private String adres;
	private int numerUrzadzenia;
	
	
	public Kasa(String nip, String nazwa, String adres, int numerUrzadzenia) {
		this.nip = nip;
		this.nazwa = nazwa;
		this.adres = adres;
		this.numerUrzadzenia = numerUrzadzenia; 	//cena pojedynczej sztuki
		
	} 
	
	
	
	public String getNip() {
		return nip;
	}

	public String getNazwa() {
		return nazwa;
	}

	public String getAdres() {
		return adres;
	}
	
	public int getNumerUrzadzenia() {
		return numerUrzadzenia;
	}

	
	
	
}
import java.util.Date;

public class Paragon {
	Pozycja [] pozycje;
	int ileDodanych = 0;
	int maksymalnyRozmiar;
	
	public Paragon() {
		maksymalnyRozmiar = 10;
	}
	
	public Paragon(int liczbaPozycji) {
		pozycje = new Pozycja[liczbaPozycji];
	}
	
	void dodajPozycje(Pozycja p) {
		if(ileDodanych < maksymalnyRozmiar) {
			pozycje[ileDodanych] = p;
		}
	
	}
	
	double obliczWartosc() {
		double wartosc = 0.0;
		
		for(int i = 0; i <= maksymalnyRozmiar; i++) {
			wartosc += pozycje[i].obliczWartosc();
		}
		
		return wartosc;
	}
	
	public String toString() {
		return ""+new Date();
	}
	
}


public class Pozycja {
	private String nazwaTowaru;
	private int ileSztuk;
	private double cena;	//cena pojedynczej sztuki
	
	public Pozycja(String nazwaTowaru, int ileSztuk, double cena) {
		this.nazwaTowaru = nazwaTowaru;
		this.ileSztuk = ileSztuk;
		this.cena = cena;
	}
	
	public double obliczWartosc() {
		return cena * ileSztuk;
	}
	
	public String toString() {
		return nazwaTowaru + " " + cena + " " + ileSztuk + " " + obliczWartosc();
	}
	
	
	
}

0

Jak mają być tworzone te paragony? Zapewne chcesz stworzyć metodę drukujParagon w kasie i przekazywać do niej listę zakupów, a ma to sens, ponieważ paragon powinien raczej posiadać dane typu nip, adres. A je posiada kasa. Ale nie mam pojęcia co chciałeś powiedzieć przez to:

tworzone przez klase Kasa czyli dodawane do Kasy.

1

Chyba najprościej coś takiego:

public class Kasa {
    	private String nip;
    	private String nazwa;
    	private String adres;
    	private int numerUrzadzenia;
		private List<Paragon> paragonList;

	public Kasa(String nip, String nazwa, String adres, int numerUrzadzenia) {
        	this.nip = nip;
        	this.nazwa = nazwa;
        	this.adres = adres;
        	this.numerUrzadzenia = numerUrzadzenia;     //cena pojedynczej sztuki
			this.paragonList = new ArrayList();
 	} 

	public void addParagon(Paragon paragon){
		this.paragonList.add(paragon);
	}
}
0

Do obiektu kasy chciałbym dodawać do niego paragony, czyli najlepszym rozwiązaniem byloby stworzenie tablicy w klasie Kasa i wrzucanie do nich obiektow Paragon???

Nie, @shagrin podała Ci najlepsze rozwiązanie.

0

a jeszcze takie pytanie:
w klasie Paragon dodalem metode:
String [] wypiszTablice() {
String [] pomocniczaTablica = new String[maksymalnyRozmiar];
for(int i = 0; i < maksymalnyRozmiar; i++) {
pomocniczaTablica[i] = pozycje[i].toString();
}
return pomocniczaTablica;
}

i gdy chce odwolac sie do tej metody zamiast wypisywac z klasy pozycja metode toString wypisuje np.

pozycje: [Ljava.lang.String;@1a6d3ca2
pozycje: [Ljava.lang.String;@69d93be
pozycje: [Ljava.lang.String;@534ea256

3

@Jaca777, ja bym się nie zgodził ze stwierdzeniem, że to najlepsze rozwiązanie... W praktyce można zrobić kasie dowolną krzywdę np. zmienić już dodany paragon.

public abstract class Kasa {

	private final String nip;
	private final String nazwa;
	private final String adres;
	private final int numerUrzadzenia;
	private final List<Paragon> paragony;

	protected Kasa(String nip, String nazwa, String adres, int numerUrzadzenia) {
		this.nip = nip;
		this.nazwa = nazwa;
		this.adres = adres;
		this.numerUrzadzenia = numerUrzadzenia;
		this.paragony = Lists.newLinkedList();
	}

	private Kasa(Kasa kasa) {
		this.nip = kasa.nip;
		this.nazwa = kasa.nazwa;
		this.adres = kasa.adres;
		this.numerUrzadzenia = kasa.numerUrzadzenia;
		this.paragony = kasa.paragony;
	}


	public final Kasa nowaTransakcja(String nip, String nazwa, String adres, int numerUrzadzenia) {
		return new OtwartaTransakcja(nip, nazwa, adres, numerUrzadzenia);
	}

	public abstract Kasa zakoncz();

	public abstract Kasa dodajPozycję(Pozycja pozycja);

	private class ZakonczonaTransakcja extends Kasa {

		public ZakonczonaTransakcja(OtwartaTransakcja otwartaTransakcja) {
			super(otwartaTransakcja);
		}

		@Override
		public Kasa zakoncz() {
			return this;
		}

		@Override
		public Kasa dodajPozycję(Pozycja pozycja) {
			throw new UnsupportedOperationException("Paragon zamknięty");
		}
	}

	private class OtwartaTransakcja extends Kasa {

		private Paragon otwartyParagon;

		OtwartaTransakcja(Kasa other) {
			super(other);
			otwartyParagon = new Paragon();
		}

		public OtwartaTransakcja(String nip, String nazwa, String adres, int numerUrzadzenia) {
			super(nip, nazwa, adres, numerUrzadzenia);
		}

		@Override
		public Kasa zakoncz() {
			paragony.add(otwartyParagon);
			return new ZakonczonaTransakcja(this);
		}

		@Override
		public Kasa dodajPozycję(Pozycja pozycja) {
			otwartyParagon.dodajPozycje(pozycja);
			return this;
		}
	}

}

Kasa ma stan. Pracuje z jednym paragonem na raz. Paragon jest produktem kasy, a nie jej częścią. Można by jeszcze pobawić się i wyeliminować te Stringi na początku zastępując ValueObjectami by nie można było jako NIPu podać na przykład "Miś Uszatek". To już są jednak szczegóły.

//edit: drobna poprawka w kodzie by tego można było używać.

0

Z tego co się orientuje, owszem kasa ma stan, ale jednak trzyma tez wszystkie paragony, nie tak?
Poza tym, jak już mamy wchodzić w szczegóły, wydaje mi się, ze brakuje jeszcze kasjera, który na danej kasie w danej chwili pracuje. Info o kasjerze powinno być tez na paragonie.

Kolejna sprawa, wydaje mi się, ze kolega który zadał pytanie jest początkujący i próbuje ogarnąć podstawy Javy, takim kodem mocno mieszasz.

Moze to kwestia niefortunnego nazewnictwa, ale jak zobaczyłam to:
private class ZakonczonaTransakcja extends Kasa
i to
private class OtwartaTransakcja extends Kasa

to pierwsze co mi przyszło do głowy, to ze przy każdym nowym kliencie użytkownik loguje się do kasy (otwiera kasę), i wylogowuje (zamyka kasę) po skasowaniu wszystkich produktów.

1

private final List<Paragon> paragony; – rolka w kasie.

Kwestia nazewnictwa, OK. Kasjer nie jest tu potrzebny, bo kasa nic nie wie o kasjerze. To jest wiedza "systemowa", czyli poziom wyżej np. StanowiskoKasowe (ciekawy przypadek DDD).

shagrin napisał(a)

Kolejna sprawa, wydaje mi się, ze kolega który zadał pytanie jest początkujący i próbuje ogarnąć podstawy Javy, takim kodem mocno mieszasz.

Serio? Nikt nie powiedział, że programowanie to łatwy kawałek chleba.

shagrin napisał(a)

ze przy każdym nowym kliencie użytkownik loguje się do kasy (otwiera kasę), i wylogowuje (zamyka kasę) po skasowaniu wszystkich produktów.

Też nie, bo masz przepływ otwarta → zamknięta → otwarta → … itd. Całość jest serią kopiowań stanu obiektu. Jednak zgodzę się, że nazewnictwo może tu zamieszać.

0

teraz wymyśliłem inny problem i nie za bardzo wiem jak połączyć te klasy:
Bankomat, Konto, Karta , (program ogólnie miałby realiować wypłate środków z bankomatu za pomoca kartydebetowej) czyli karta powinna rozszerzać klase Konto, dobrze mowie,bo karta jest można powiedzieć częścią konta a moze byc karta klasa zagniezdzona w klasie konto ?? wlasnie nie mam pomysłu jak podejść do problemu :)


import java.util.ArrayList;
import java.util.Date;


public class Bankomat {
	 private static int idBankomatu;
	 private static String lokalizacjaBankomatu;
	 private static String infoBank; 				//okresla bank do ktorego bankomat nalezy 
	 private static Konto konto;
	 private ArrayList<Karta> karta;
	 
	 /*
	  * 
	  */
	 Bankomat(int id ,String b) {
		 idBankomatu = id;
		 infoBank = b;
		 karta = new ArrayList<>();
	 }
	 
	 public void dodajKarte(Karta karta) {
		 this.karta.add(karta);
	 }
	 
	 /*
	  * sprawdz bank jesli jest inny dolicz prowizje od transakcji
	  */
	 public void sprawdzBank(String nazwaBanku) {
		 if(infoBank != nazwaBanku) {
			 
		 }
	 }
	 
	 public void wyplacSrodki(int wyplac) {
		//sprawdzBank(karta.);
		konto.wyplacSrodki(wyplac);
 	 }
	 
	
	 public void wplacSrodki(int wplac) {
		konto.wplacSrodki(wplac);
	 }
	 
	 
	 /*
	  * wydruk wszystkich transakcji o okreslonej dacie
	  */
	 public void wydrukujTransaksje(Date date) {
		 
	 }
	 
	 public void potwierdzenieTransaksji() {
		 
	 }
	 
	 public  String toString() {
		 return "";
	 }
}




public class Konto {
	private String rodzajKonta;
	private String daneWlasciciela;
	private int dostepneSrodki = 60;
	
	public Konto() {
		
	}
	
	public void wyplacSrodki(int wyplac) {
		
		if(wyplac < dostepneSrodki) {
			dostepneSrodki -= wyplac;
			System.out.println("Na koncie pozostalo " + dostepneSrodki + "oraz wyplacono" + wyplac);
		}
		
		else {
			System.out.println("Posiadasz za malo srodkow na koncie " + dostepneSrodki);
		}
	}
	
	
	public void wplacSrodki(int wplac) {
		dostepneSrodki += wplac;
		System.out.println("Na koncie znajduje sie teraz " + dostepneSrodki + " zl");
	}
	
	
	public void przelej(int pieniadze, int numerKonta) {
		if(pieniadze < dostepneSrodki) {
			
		}
	}
	
	public String stanKonta() {
		return "dane wlasciciela: " + daneWlasciciela + "\n" + 
				"Twoj stan konta wynosi: " + dostepneSrodki +"\n" +
				"rodzaj konta: " + rodzajKonta;
	}
	
}

public class Karta {
	private long numer;
	private String daneWlasciciela;
	private String waznoscKarty;
	private String infoBankowe;
	
	public Karta(long numer, String daneWlasciciela, String waznoscKarty, String infoBankowe) {
		this.numer = numer;
		this.daneWlasciciela = daneWlasciciela;
		this.waznoscKarty = waznoscKarty;
		this.infoBankowe = infoBankowe;
	}
	
	
	public long getNumer() {
		return numer;
	}
	
	public String getDaneWlasciciela() {
		return daneWlasciciela;
	}
	
	public String getWaznoscKarty() {
		return waznoscKarty;
	}
	
	public String getInformacjBankowe() {
		return infoBankowe;
	}
	
}
public class Main {
	public static void main(String [] args) {
		Bankomat bankomat1 = new Bankomat(6530355,"ipko");
		Karta k1 = new Karta(963731005,"Marcin Nowak", "16-12-2020","BGZ");
		bankomat1.dodajKarte(k1);
	}

	
}

1

Karta nie jest kontem. Karta powinna być przypisana do konta. I w tym przypadku wydziel klasę InfoBank, bo masz takie pole w kilku miejscach i warto mieć tu coś więcej niż "goły" String

0

dobra już zrobilem dodatkowa klase InfoBank(pola w niej przypisałem jako protected oraz metody również) i te 2 klasy dziedziczą po tej klasie i dzięki tobie teraz to lepiej wygląda, a nie za bardzo rozumiem tej twojej myśli Karta powinna być przypisana do konta. czyli jak teraz to zrobilem np. mozna przez polimorfizm sie odwolywac

1

Trochę inaczej:


class InfoBank{

     private String nazwa;
     private int kod;

   // konstruktor gettery settery
}

class Karta {
    
    private InfoBank infoBank;
    /// reszta danych, gettery, settery

}

class Konto{

       private InfoBank infoBank;
       private Collecttion<Karta> kartyPrzypisaneDoKonta;

      // reszta danych, gettery, settery

}

W ten sposób masz "prawdziwe" odwzorowanie. Konto ma przypisane do siebie karty, InfoBank zamyka w sobie wszelkie informacje o banku, co daje m.in. swobodę operowania tymi danymi. Karta ma informacje o banku – wystawcy.

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