#java #relationship #composition #aggregation
#java #отношения #композиция #агрегация
Вопрос:
Недавно я выполняю упражнения по кодированию, которые мне нужны для создания моего проекта, и пока я практикуюсь в этом с кодом ниже, я хочу спросить, имеет ли это отношение? правильно ли я поступаю? посмотрите на мой код, извините за мой плохой английский
public class Personal {
private String firstName;
private String middleInitial;
private String lastName;
private int age;
public Personal(String firstName,String middleInitial , String lastName , int age){
setFirstName(firstName);
setMiddleInitial(middleInitial);
setLastName(lastName);
setAge(age);
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public String getFirstName(){
return firstName;
}
public void setMiddleInitial(String middleInitial){
this.middleInitial = middleInitial;
}
public String getMiddleInitial(){
return middleInitial;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public String getLastName(){
return lastName;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public String toString(){
return String.format("First Name: " getFirstName() "nMiddle Initial: " getMiddleInitial()
"nLast Name: " getLastName() "nAge: " getAge());
}
}
Класс контакта
public class Contact {
private String address;
private String email;
private String contactNumber;
public Contact(String address,String contactNumber, String email){
setAddress(address);
setContactNumber(contactNumber);
setEmail(email);
}
public void setAddress(String address){
this.address = address;
}
public String getAddress(){
return address;
}
public void setEmail(String email){
this.email = email;
}
public String getEmail(){
return email;
}
public void setContactNumber(String contactNumber){
this.contactNumber = contactNumber;
}
public String getContactNumber(){
return contactNumber;
}
public String toString(){
return String.format("Address: " getAddress() "nContact Number: " getContactNumber()
"nEmail Address: " getEmail());
}
}
Класс Employee
public class Employee {
private Personal personal;
private Contact contact;
public Employee(Personal personal, Contact contact){
this.personal = personal;
this.contact = contact;
}
public void setFirstName(String firstName){
this.personal.setFirstName(firstName);
}
public String toString(){
return String.format(personal.toString() contact.toString());
}
}
И тестовый класс
public class TestClass {
public static void main(String[] args){
Personal personalHerp = new Personal("John","M","Doe",18);
Contact contactHerp = new Contact("88 Herp Derp St U mad New york","724-15-70","fido.com");
Employee employeeHerp = new Employee(personalHerp,contactHerp);
System.out.println(employeeHerp);
}
}
Комментарии:
1. Не могли бы вы сказать что-нибудь о модели, которую вы пытаетесь создать, и какие отношения вы хотите смоделировать? Там есть некоторые ассоциации, но без информации о том, чего вы пытаетесь достичь, трудно ответить на ваш вопрос.
2. почему String.format в методах toString()? Просто удалите вызов этого метода. String.format полезен для String.format(«Hello %s!»,»world»), который выдает одну строку «Hello world!». В вашем случае — это не нужно. Просто напишите «return personal.toString() contact.toString()».
3. иван сопов, что я буду использовать? тогда? Я хочу вернуть все атрибуты в текст в моем личном и контактном классе
4. чуваки, все, что он / она спросил, было ли это отношением has-a (и это так). зачем беспокоить его / ее (и, следовательно, путать его / ее) обо всем остальном. позвольте ему / ей учиться в своем темпе и переходить к строковым материалам позже, как только он / она поймет «has-a».
Ответ №1:
Ну, поскольку Employee
не распространяется Personal
, у него есть a Personal
и a Contact
.
Я думаю, вы бы предпочли Employee
быть a Personal
и, следовательно, это должно выглядеть так:
public class Employee extends Personal {
private Contact contact;
...
}
Итак, подведем итог:
- is-a означает, что класс / объект расширяет другой класс или реализует интерфейс, т.Е. A является B, если
A extends B
илиA implements B
- has-a означает, что класс / объект имеет переменную такого типа, как
Contact contact
в вашемEmployee
классе, что означаетEmployee
has-a contact .
Комментарии:
1. но я уже делал это с моим прошлым моделированием классов, но в итоге у меня получилось 12 конструкторов, извините за имя с опечаткой, но на самом деле это персональная информация, в любом случае, больше предложений?
2. Подумайте немного, прежде чем создавать структуру классов, и решите, что тесно связано с
Personal
-s, а что нет. Тесно связанные вещи должны быть отнесены к суперклассу, остальное, что может быть атрибутами других объектов (например, контактная информация, местоположение или что-то еще), должно быть отнесено к отдельным классам.3. Я понимаю, но если я это сделаю, у меня будет 5 параметров в моем конструкторе, разве это не плохо?
4. @KyelJmD Это зависит от того, каковы эти параметры, но 5 параметров не так уж и плохи. Однако вы можете создать объект контейнера, подобный вашему
PersonalInformation
(в этом случаеPersonal
он может иметьPersonalInformation
атрибут).
Ответ №2:
Да, это отношения «has-a» (точно так же, как мы обсуждали в вашем другом вопросе).