Odwoływanie się do klasy, w klasie..

0

Cześć :)

Moje zadanie na dzisiaj to:

Stworzyć klasę Employee (pracownik), opisującą wspólne atrrybuty danych o pracownikach:

  • imię,
  • nazwisko,
  • wiek,
  • pensja.

oraz zawierającą odpowiednie metody, które pozwolą uzyskać informacje o danym pracowniku oraz ustalić pensję i zmienić pensję o podany procent.

Użyć tej klasy w innej klasie, w której dostarczymy:

  1. metody definiowania danych o pracownikach:
    Employee defEmp(String msg),
    która w dialogu wejściowym
    pyta użytkownika o dane pracownika (argument msg jest komunikatem np. "Podaj dane o pracowniku"),
    tworzy obiekt, reprezentujący wprowadzone dane o pracowniku,
    i zwraca referencję do niego.

Większość poszła bez problemu, jednak stanąłem na metodzie Employee defEmp(String msg).

Employee.java

package zad22;

public class Employee {
public String imie;
public String nazwisko;
public int wiek;
public double pensja;

public String podaj_imie(){
	return imie;
}
public String podaj_nazwisko(){
	return nazwisko;
}
public int podaj_wiek(){
	return wiek;
}
public double podaj_pensje(){
	return pensja;
}
public void ustal_pensje(double p){
	pensja = p;
	
}
public void zmien_pensje(double p){
	pensja = pensja + pensja*(p/100);
}
}

Emp.java

package zad22;
import javax.swing.JOptionPane;
public class Emp {
public Emp(){

}
	public Employee defEmp(String msg){
		 JOptionPane.showMessageDialog(null, msg);
		 String imie = JOptionPane.showInputDialog("Podaj imię pracownika");
		 Employee.imie = imie;
		return null;
	}
}

Zad22.java

package zad22;


public class Zad22 {

  

public static void main(String[] args) {
Emp e1 = new Emp();
e1.defEmp("Podaj dane pracownika");	
  }


}

Jak w klasie Emp odwołać się do klasy Employee.
Aby w klasie Emp były tylko komunikaty, jednak w niech wykonywały się metody klasy Employee (np. ustal_pensje).

Gdy jest tak jak teraz - Employee.imie = imie; to Eclipse chce mi zmienić w klasie Employee na
public static String imie;
a raczej nie o to chodzi :)

Proszę o pomoc.. ;)

Dzięki z góry.

0
NetJaro napisał(a)

Cześć :)
Gdy jest tak jak teraz - Employee.imie = imie; to Eclipse chce mi zmienić w klasie Employee na
public static String imie;
a raczej nie o to chodzi :)

Musisz stworzyc obiekt klasy Employee:

Employee newEmployee = new Employee();
newEmployee.imie = imie;
return newEmployee;
0

Świetnie - o to chodziło :)

dzięki wielkie!

0

Mam jeszcze dwa pytania.

  1. Co to oznacza:
public Employee defEmp(String msg){
Employee z1 = new Employee();

A dokładniej chodzi mi o Employee. Po co to jest? Bez tego nie chce działać - a to "Employee" Eclipse mi podpowiedziało :)

  1. Co to oznacza:
public void showInfo(Object p){
		JOptionPane.showMessageDialog(null, ((Employee) p).podaj_imie());
		
	}

Chodzi mi o ((Employee) p).. Po co tyle nawiasów? Rozumiem, że tutaj chodzi o rzutowanie?

Dzięki za pomoc z góry. :)

Życzę miłego wieczoru.

0
  1. Musisz zadeklarować jakiego typu ma być twój obiekt. W tym przypadku twój obiekt z1 będzie typu Employee.

  2. Argument metody jest typu "Object". "Object" nie posiada metody "podaj_imie()" ale jeżeli wiesz, że przekazałeś w tym miejscu obiekt klasy "Employee" to możesz go rzutować i skorzystać z metody, którą "Employee" już posiada. Inaczej można by to zapisać:

public void showInfo(Object p){
	//tu rzutujemy
        Employee e = (Employee)p;
        // mamy juz obiekt typu Employee i mozemy wywołac e.podaj_imie()
        JOptionPane.showMessageDialog(null, e.podaj_imie());
}

Pozdrawiam

0

A ja mam pytanie dotyczące tego samego zadania. Dlaczego metoda zmiany pensji działa wyłącznie uwzględniając odwołanie do newEmployee,tj:

	                String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
	                int zmianaWart = Integer.parseInt(zmiana);
	                newEmployee.zmien_pensje(zmianaWart);
  	              
                        JOptionPane.showMessageDialog(null, newEmployee.pensja);

a nie np:

 JOptionPane.showMessageDialog(null, pensja);

Cała klasa:



class Emp2 {
	public Emp2(){

	}
	        public Employee2 defEmp(String msg){
	                JOptionPane.showMessageDialog(null, msg);
	                String imie = JOptionPane.showInputDialog("Podaj imię pracownika");
	                 Employee2 newEmployee = new Employee2();
	                 newEmployee.imie = imie;	                
	
	                 String pensja = JOptionPane.showInputDialog("Podaj pensję");
	                 int penWart = Integer.parseInt(pensja);
	                 newEmployee.pensja = penWart;
	                 
	                 
	                String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
	                int zmianaWart = Integer.parseInt(zmiana);
	                newEmployee.zmien_pensje(zmianaWart);

  	                JOptionPane.showMessageDialog(null, newEmployee.pensja);
	               
                       return newEmployee;
	        }
	}


Zadanie już dawno nieaktualne ale chciałbym zrozumieć o co w nim chodzi. Dziękuję za wszelkie odpowiedzi [???]

0

A no dlatego że w metodzie to defEmp(String str) tworzysz nowy obiekt i tylko w na nim operujesz.

To zadanie jest beznadziejne rozwiązane. W pierwszym poście wszystkie pola klasy są publiczne, co łamie hermetyzacje, pomimo tego posiada metody ustawiające i pobierające te wartości, bezsens. I ta metoda showInfo() padaczka.

Klasa Employee powinna mieć ładnie formatującą dane pracownika metodę toString() i przy jej pomocy można przekazać do jakiegoś okienka, (jeśli już ktoś w taki sposób chce wyświetlać te dane) dane o tej osobie.

Może być na przykład tak:


class Employee {

private float pensja
//inne pole i metody

publiv void setPensja(float pensja) {
      this.pensja = pensja;
}

public float getPensja() { 
    return this.pensja;
}
@Override 
public String toString() {
StringBuilder sb = new StringBuilder();
//...
sb.append("Pensja: "+this.getPensja()+"\n");
//..
return sb.toString();


}

}


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