/ / Nie można uzyskać kodu hash rodzica i ustawić go jako zmienną dziecka - java, swing, object, hashcode, super

Nie można uzyskać hashcode rodzica i ustawić go jako zmienną dziecka - java, swing, object, hashcode, super

Mam klasę o nazwie Doctori klasa Patient to rozszerza to. W mojej aplikacji lekarz loguje się przy użyciu nazwy użytkownika i hasła oraz rejestruje grupę pacjentów.

Identyfikator lekarza ma hashcode() metoda, którą znam, działa (automatycznie generowana przez Eclipse i była wcześniej testowana jako generująca unikalne kody skrótu na podstawie nazw użytkowników), podobnie jak pacjent.

Mam zmienną o nazwie patientdID i patientduserName, i dID i duserName (lekarze) oraz osoby pobierające i ustawiające zarówno dla lekarza, jak i pacjenta.

Kiedy pacjent jest zarejestrowany, chcę generowaćplik pól pacjenta obejmujący lekarza, który zarejestrował pacjenta, i pacjenta zarejestrowanego za pomocą metody toString () pacjenta. Jednak w tej chwili identyfikator pacjenta nie jest ustawiony jako identyfikator pacjenta, a identyfikator pacjenta zawsze ma wartość 31 (nie jest to tak naprawdę prawdziwy kod skrótu lekarza).

Po zarejestrowaniu pacjenta wywoływany jest następujący kod (wstawiono odpowiednie części):

patient = new Patient();
doctor = new Doctor();

patient.setpatientdID(doctor.getdID());
patient.setpatientdUserName(usernameField.getText());

Pobieracze dla tych pól dla pacjenta to:

public void setpID(int pID) {
this.pID = pID;
}

public int getpatientdID() {
return patientdID;
}


public void setpatientdID(int patientdID) {
this.patientdID = patientdID;
}

public String getpatientdUserName() {
return patientduserName;
}

A dla Doktora są:

public int getdID() {
return dID;
}

public void setdID(int dID) {
this.dID = dID;
}

public String getDuserName() {
return duserName;
}

public void setDuserName(String duserName) {
this.duserName = duserName;
}

Konstruktorami dla Doctor są:

public Doctor() {
this.dID = this.hashCode();
this.duserName = duserName;
this.dpassWord = dpassWord;
}

A dla Pacjenta są:

public Patient() {
super();
this.pFirstName = pFirstName;
this.pLastName = pLastName;
this.pDob = pDob;
this.pAddress = pAddress;
this.pPhoneNumber = pPhoneNumber;
this.pBillingCycle = pBillingCycle;
this.pMedicalCondition = pMedicalCondition;
this.pComments = pComments;
}

Na koniec metoda toString () pacjenta to:

public String toString() {
return patientdID+","+patientduserName+","+this.hashCode() + "," + pFirstName + "," + pLastName + "," + pDob
+ "," + pAddress + "," + pPhoneNumber + "," + pBillingCycle
+ "," + pMedicalCondition + "," + pComments;
}

Majstrowałem i siekałem przez torozumiem, ale wolałbym odpowiedź, która powiedziałaby mi, jak ustrukturyzować mój kod, biorąc pod uwagę mój cel i co powinienem robić, np. dzwoniąc gdzieś super itp.

Odpowiedzi:

2 dla odpowiedzi № 1

Przede wszystkim klasa pacjentów powinna NIE przedłużyć Doktora. Kropka. To nie jest i nigdy nie może być jest związek, ale zamiast tego jest ma związek: pacjent ma lekarz (lub więcej niż jeden). Daj więc pacjentowi pole lekarza, jeśli mają jednego lekarza lub lekarza List<Doctor> jeśli mają wielu lekarzy i wypełnij pole w razie potrzeby. Następnie możesz w razie potrzeby wyodrębnić informacje z pola.

Jako zalecenia boczne:

  • Nie używałbym hashCode dla identyfikatorów. Również unikałbym używania ints lub innego typu liczbowego, ponieważ identyfikator nie jest czymś, na czym można by wykonywać operacje numeryczne, takie jak dodawanie lub odejmowanie. Zamiast tego użyłbym String.
  • Konstruktorzy bez parametrów, którzy ustawiają sobie pola, są bezużyteczni. W tej sytuacji to this.pFirstName = pFirstName; po prostu ustawi pFirstName na coś, co klasa początkowo zdefiniowała jako, perhap null parzysty. Używaj parametrów, kiedy potrzebujesz.
  • OK, aby użyć dziedziczenia, aby dać lekarzowi i pacjentowi wspólną klasę podstawową, powiedzmy o nazwie Person. Może mieć pole nazwy, pole identyfikatora i dowolne inne pola wspólne z odpowiednimi konstruktorami.

Na przykład coś w stylu:

// a base class that abstracts what is shared by Doctor and Patient
public class Person {
private String id;
private String name;
// .... etc

public Person(String id, String name) {
this.id = id;
this.name = name;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

}

public class Doctor extends Person {
private List<Patient> patients = new ArrayList<>();

public Doctor(String id, String name /* add any additional params here*/) {
super(id, name);
// ...  set fields here
}

public boolean addPatient(Patient p) {
return patients.add(p);
}

}

public class Patient extends Person {

private Doctor doctor;

public Patient(String id, String name, Doctor doctor /* add any additional params here*/) {
super(id, name);
this.doctor = doctor;
// ... set additional fields here
}

// you can get the Doctor"s id from its object
public Doctor getDoctor() {
return doctor;
}

}

0 dla odpowiedzi nr 2

Doszedłem do tego za pomocą skrótów, ale doceniam powyższą odpowiedź.

Nazwę użytkownika należy ustawić przed utworzeniem kodu skrótu lekarza (ponieważ kod skrótu jest na nim oparty). Potrzebowałem więc:

doctor.setDuserName(usernameField.getText());
patient.setpatientdID(doctor.hashCode());

Usunąłem również odniesienia do super() w konstruktorze dla pacjenta, ale nie sądzę, że to robi różnicę, ponieważ nie zastępuję dokumentów tożsamości lekarza.

Zgadzam się z tobą w kwestii dziedziczenia. Mój patientdID i patientdUserName zmienne w ramach Patient są podobne do sytuacji, gdy mówisz „daj pacjentowi pole lekarza”.