JavaRush /Blog Java /Random-VI /Mối quan hệ giữa các lớp. Kế thừa, thành phần và tổng hợp...

Mối quan hệ giữa các lớp. Kế thừa, thành phần và tổng hợp

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ xem xét kỹ hơn một nguyên tắc khác của lập trình hướng đối tượng (OOP) - tính kế thừa. Đồng thời, chúng ta sẽ nghiên cứu các kiểu quan hệ khác giữa các lớp - thành phần và tập hợp. Chủ đề này sẽ không khó: bạn đã gặp về tính kế thừa và các ví dụ của nó nhiều lần trong các bài giảng trước. Hôm nay, việc chính sẽ là củng cố kiến ​​​​thức của bạn, xem xét kỹ hơn cơ chế kế thừa và xem lại các ví dụ một lần nữa :) Vì vậy, hãy bắt đầu!
Mối quan hệ giữa các lớp.  Kế thừa, thành phần và tổng hợp - 1

Kế thừa trong Java và lợi ích của nó

Có thể bạn còn nhớ, tính kế thừa là một cơ chế cho phép bạn mô tả một lớp mới dựa trên lớp (cha) hiện có. Trong trường hợp này, các thuộc tính và chức năng của lớp cha được lớp mới mượn. Hãy nhớ lại ví dụ về sự kế thừa ở các bài giảng trước:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       //...gas
   }

public void brake() {
       //...brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Có một chương trình nhất định trong đó chúng tôi làm việc với nhiều loại ô tô khác nhau. Ngay cả khi bạn không phải là người đam mê ô tô, bạn có thể biết rằng trên thế giới có rất nhiều loại ô tô giống nhau :) Vì vậy, chúng tôi tách các đặc tính chung của ô tô thành một lớp cha chung - Car. Tất cả các ô tô có điểm gì chung, bất kể loại nào? Bất kỳ chiếc xe nào cũng có năm sản xuất, tên mẫu và tốc độ tối đa. Chúng ta đặt các thuộc tính này vào các trường model, maxSpeed, yearOfManufacture. Về hành vi, bất kỳ chiếc xe nào cũng có thể tăng tốc và phanh :) Chúng tôi xác định hành vi này trong các phương thức gas()brake(). Điều này mang lại cho chúng ta những lợi ích gì? Trước hết, giảm số lượng mã. Tất nhiên, chúng ta có thể làm mà không cần lớp cha. Nhưng vì mọi ô tô đều phải có khả năng tăng tốc và phanh nên chúng ta sẽ phải tạo các phương thức gas()trong brake()lớp Truck, trong lớp Sedan, trong lớp F1Car, trong lớp Sportcarvà trong tất cả các lớp ô tô khác. Hãy tưởng tượng chúng ta sẽ viết thêm bao nhiêu mã trong trường hợp này. Đừng quên các trường mô hình, maxSpeed ​​​​và YearOfSản xuất: nếu chúng ta từ bỏ lớp cha, chúng ta sẽ tạo chúng trong mỗi lớp máy! Mối quan hệ giữa các lớp.  Kế thừa, thành phần và tổng hợp - 2 Khi chúng ta có vài chục lớp máy, số lượng mã lặp đi lặp lại sẽ trở nên thực sự nghiêm trọng. Việc chuyển các trường và phương thức chung (còn được gọi là “trạng thái” và “hành vi”) vào lớp cha sẽ cho phép chúng ta tiết kiệm rất nhiều thời gian và không gian. Nếu một loại máy nhất định có các thuộc tính hoặc phương thức chỉ dành riêng cho nó và không có ở các loại máy khác thì điều đó không thành vấn đề. Chúng luôn có thể được tạo trong lớp con cháu, tách biệt với tất cả các lớp khác.
public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Lấy trường hợp của những chiếc xe đua Công thức 1. Họ, không giống như “họ hàng” của mình, có một hành vi độc đáo - thỉnh thoảng họ dừng lại để dừng lại. Điều này không làm phiền chúng tôi. Chúng ta đã mô tả hành vi chung trong lớp cha Carvà chúng ta có thể thêm hành vi cụ thể của các lớp con bên trong các lớp đó. Mối quan hệ giữa các lớp.  Kế thừa, thành phần và tổng hợp - 3 Điều này cũng áp dụng cho các trường: nếu một lớp con có các thuộc tính duy nhất, chúng ta có thể bình tĩnh khai báo các trường này bên trong nó mà không cần lo lắng :) Khả năng sử dụng lại mã là ưu điểm chính của tính kế thừa. Điều rất quan trọng đối với một lập trình viên là không viết số lượng mã không cần thiết. Bạn sẽ gặp phải điều này nhiều lần trong công việc của mình. Hãy nhớ một điều rất quan trọng nữa: không có tính đa kế thừa trong Java. Mỗi lớp chỉ kế thừa từ một lớp duy nhất. Chúng ta sẽ nói về lý do chi tiết hơn trong các bài giảng sau, nhưng bây giờ hãy nhớ nhé. Nhân tiện, điều này giúp phân biệt Java với một số ngôn ngữ OOP khác. Ví dụ: C++ có nhiều kế thừa. Mọi thứ ít nhiều rõ ràng với tính kế thừa - hãy tiếp tục.

Thành phần và tổng hợp

Các lớp và đối tượng có thể liên quan với nhau. Kế thừa mô tả mối quan hệ "là" (hoặc trong tiếng Anh là "IS A"). Leo là một con vật. Mối quan hệ này có thể được biểu diễn dễ dàng bằng cách sử dụng tính kế thừa, trong đó Animallớp sẽ là lớp cha và Lionlớp sẽ là lớp con. Tuy nhiên, không phải tất cả các mối quan hệ trên thế giới đều được mô tả theo cách này. Ví dụ: bàn phím chắc chắn được kết nối với máy tính theo cách nào đó, nhưng nó không phải là máy tính . Bàn tay bằng cách nào đó được kết nối với con người, nhưng chúng không phải là con người. Trong những trường hợp này, nó dựa trên một loại quan hệ khác: không phải “là”, mà là “là một phần” (“HAS A”). Bàn tay không phải là con người nhưng nó là một phần của con người. Bàn phím không phải là máy tính nhưng nó là một phần của máy tính. Các mối quan hệ HAS A có thể được mô tả trong mã bằng cách sử dụng các cơ chế tổng hợptổng hợp . Sự khác biệt giữa chúng nằm ở mức độ “nghiêm ngặt” của những kết nối này. Hãy đưa ra một ví dụ đơn giản: Chúng tôi có cái của mình Car- một chiếc ô tô. Mỗi chiếc xe đều có một động cơ. Ngoài ra, mỗi toa đều có hành khách bên trong. Sự khác biệt cơ bản giữa các trường Engine enginevà là gì Passenger [] passengers? Nếu một ô tô có hành khách bên trong А, điều này không có nghĩa là không thể có hành khách trong Bđó C. Một chiếc xe có thể chứa nhiều hành khách. Ngoài ra, nếu tất cả hành khách được đưa ra khỏi xe, nó sẽ tiếp tục hoạt động lặng lẽ. Mối quan hệ giữa hạng ghế Carvà số lượng hành khách Passenger [] passengersít chặt chẽ hơn. Nó được gọi là tổng hợp . Có một bài viết hay về chủ đề này: Mối quan hệ giữa các lớp (đối tượng) . Nó cung cấp một ví dụ tốt khác về tổng hợp. Giả sử chúng ta có một lớp Studentbiểu thị một học sinh và một lớp StudentsGroup(một nhóm học sinh). Học sinh có thể là thành viên của câu lạc bộ vật lý, câu lạc bộ người hâm mộ sinh viên Star Wars hoặc đội KVN. Thành phần là một loại giao tiếp chặt chẽ hơn. Khi sử dụng thành phần, một đối tượng không chỉ là một phần của đối tượng nào đó mà còn không thể thuộc về một đối tượng khác cùng loại. Ví dụ đơn giản nhất là động cơ ô tô. Động cơ là một bộ phận của một chiếc ô tô nhưng không thể là một bộ phận của một chiếc ô tô khác. Như bạn có thể thấy, kết nối của chúng chặt chẽ hơn nhiều so với CarPassengers. Mối quan hệ giữa các lớp.  Kế thừa, thành phần và tổng hợp - 4
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION