Quan hệ HAS-A trong Java




Nếu một lớp có một tham chiếu thực thể, thì nó được biết đến như là một lớp có quan hệ HAS-A. Giả sử một tình huống, đối tượng Employee chứa nhiều thông tin như id, name, eamailID, … Nó gồm một hoặc nhiều đối tượng address mà có thông tin riêng như city, state, country, zipcode, … như sau:

class Employee{  
int id;  
String name;  
Address address; //Address la mot lop 
...  
}  

Trong tình huống như vậy, Emloyee có một address là tham chiếu thực thể, vì thế mối quan hệ là Employee HAS-A address.

Tại sao và khi nào sử dụng quan hệ HAS-A

  • Sử dụng quan hệ HAS-A giúp làm tăng tính tái sử dụng của code. Và khi không có mối quan hệ IS-A, thì quan hệ HAS-A là lựa chọn tốt nhất.

  • Tính kế thừa nên chỉ được sử dụng nếu mối quan hệ IS-A được duy trì thông qua suốt vòng đời của đối tượng có liên quan; nếu không thì, quan hệ HAS-A là lựa chọn tốt nhất.

Ví dụ đơn giản về quan hệ HAS-A trong Java

Trong ví dụ, chúng ta tạo tham chiếu của lớp Operation trong lớp Circle.

class Operation{  
 int square(int n){  
  return n*n;  
 }  
}  
  
class Circle{  
 Operation op; //quan hệ HAS-A  
 double pi=3.14;  
    
 double area(int radius){  
   op=new Operation();  
   int rsquare=op.square(radius); //tai su dung code (vi du: uy quyen cho loi goi phuong thuc).  
   return pi*rsquare;  
 }  
  
     
    
 public static void main(String args[]){  
   Circle c=new Circle();  
   double result=c.area(5);  
   System.out.println(result);  
 }  
}   

Ví dụ

Như trong ví dụ trên đã đề cập, Employee có một đối tượng là Address, đối tượng này chứa thông tin riêng như city, state, country, … Trong tình huống này, mối quan hệ là Employee HAS-A address.

Tệp Address.java có nội dung:

public class Address {  
String city,state,country;  
  
public Address(String city, String state, String country) {  
    this.city = city;  
    this.state = state;  
    this.country = country;  
}  
  
}   

Tệp Emp.java có nội dung sau:

public class Emp {  
int id;  
String name;  
Address address;  
  
public Emp(int id, String name,Address address) {  
    this.id = id;  
    this.name = name;  
    this.address=address;  
}  
  
void display(){  
System.out.println(id+" "+name);  
System.out.println(address.city+" "+address.state+" "+address.country);  
}  
  
public static void main(String[] args) {  
Address address1=new Address("hanoi","HN","vietnam");  
Address address2=new Address("hadong","HN","vietnam");  
  
Emp e=new Emp(111,"hoang",address1);  
Emp e2=new Emp(112,"thanh",address2);  
      
e.display();  
e2.display();  
      
}  
}  

Chạy chương trình trên sẽ cho kết quả:

Output:111 hoang
       hanoi HN vietnam
       112 thanh
       hadong HN vietnam