CodeGym /Blog Java /Ngẫu nhiên /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
CHÀO! Hôm nay chúng ta sẽ xem xét kỹ hơn một nguyên tắc của Lập trình hướng đối tượng (OOP): Kế thừa. Chúng ta cũng sẽ nghiên cứu các loại quan hệ khác giữa các lớp: thành phần và tập hợp. Mối quan hệ giữa các lớp.  Kế thừa, hợp thành và tổng hợp - 1Chủ đề này sẽ không khó: bạn đã gặp nhiều lần về thừa kế và các ví dụ về thừa kế trong các bài học trước. Hôm nay, điều chính sẽ là củng cố kiến ​​\u200b\u200bthức của bạn, xem xét chi tiết hơn cơ chế kế thừa và một lần nữa xem qua một số ví dụ. :) Nào đi thôi!

Tính kế thừa trong Java và những ưu điểm của nó

Chắc hẳn bạn còn 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 một lớp hiện có (lớp cha). Khi làm như vậy, lớp mới mượn các thuộc tính và chức năng của lớp cha. Hãy nhớ lại một ví dụ về kế thừa đã đưa ra trong các bài học 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);
   }
}
Chúng tôi có một chương trình nhất định liên quan đến việc 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 có rất nhiều loại ô tô trên thế giới. :) Theo đó, ta sẽ tách các thuộc tính chung của car thành một lớp cha chung gọi là Car. Vì vậy, những gì phổ biến cho tất cả các xe ô tô, bất kể loại của họ là gì? Mỗi chiếc xe đều có năm sản xuất, tên kiểu xe và tốc độ tối đa. Chúng tôi đặt các thuộc tính này vào các trường model, maxSpeedyearOfManufacture. Về hành vi, bất kỳ chiếc xe nào cũng có thể tăng tốc và giảm tốc độ. :) Chúng tôi xác định hành vi này trong gas()brake()các phương pháp. Điều này mang lại cho chúng ta những lợi ích gì? Trước hết, nó làm 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ô phải có khả năng tăng tốc và giảm tốc độ, nên chúng ta sẽ phải tạo gas()brake()các phương thức trong các lớp Truck, Sedan, F1Car, SportsCarvà trong mọi lớp ô tô khác. Hãy tưởng tượng chúng ta sẽ phải viết thêm bao nhiêu mã. Và đừng quên các trường model, maxSpeedyearOfManufacture: nếu chúng ta loại bỏ lớp cha, chúng ta sẽ phải tạo chúng trong mỗi lớp ô tô! Mối quan hệ giữa các lớp.  Kế thừa, thành phần và tập hợp - 2Khi chúng tôi có vài chục loại ô tô, số lượng mã trùng lặp trở nên thực sự nghiêm trọng. Di 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") sang lớp cha 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 số loại có các thuộc tính hoặc phương thức độc đáo mà các loại ô tô khác không có, thì không có vấn đề gì lớn. Bạn luôn có thể tạo chúng trong một lớp hậu duệ, tách biệt với những lớp khác.

public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

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

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

Các lớp và các đối tượng có thể được liên kết với nhau. Kế thừa mô tả mối quan hệ "is-a". Sư tử là một con vật. Một mối quan hệ như vậy được thể hiện dễ dàng bằng cách sử dụng tính kế thừa, Animallớp cha ở đâu và Lionlớp con ở đâu. Tuy nhiên, không phải tất cả các mối quan hệ đều được mô tả theo cách này. Ví dụ: bàn phím chắc chắn liên quan đến máy tính, nhưng nó không phải là máy tính . Bàn tay bằng cách nào đó có liên quan đến một người, nhưng chúng không phải là một người. Trong những trường hợp này, chúng ta có một kiểu quan hệ khác: không phải "is-a", mà là "has-a". Một bàn tay không phải là một người, nhưng là một phần của một người. Bàn phím không phải là máy tính, mà là một phần của máy tính. Một mối quan hệ có-một có thể được mô tả trong mã bằng cách sử dụng thành phầntập hợp. Sự khác biệt nằm ở "độ nghiêm ngặt" của mối quan hệ. Hãy đưa ra một ví dụ đơn giản: Chúng tôi có một Carlớp học. Mỗi chiếc xe có một động cơ. Ngoài ra, mọi chiếc xe đều có hành khách. Sự khác biệt cơ bản giữa các lĩnh vực Engine enginevà là gì Passenger[] passengers? Việc hành khách Angồi trên xe không có nghĩa là hành khách không Bngồi Ctrên xe. Một toa có thể tương ứng với nhiều hành khách. Hơn nữa, nếu tất cả hành khách ra khỏi xe, xe vẫn hoạt động trơn tru. Mối quan hệ giữa Carlớp và Passenger[] passengersmảng ít chặt chẽ hơn. Nó được gọi là tập hợp . 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 Studentlớp và mộtStudentGrouplớp học. Một sinh viên có thể tham gia nhiều tổ chức sinh viên: câu lạc bộ vật lý, câu lạc bộ người hâm mộ Star Wars và/hoặc câu lạc bộ hài kịch sinh viên. Thành phần là một loại mối quan hệ chặt chẽ hơn. Khi sử dụng bố cục, một đối tượng là một phần của một số đối tượng và 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 phần của ô tô và không thể là một phần của ô tô khác. Như bạn có thể thấy, mối quan hệ của chúng chặt chẽ hơn nhiều so với mối quan hệ giữa CarPassengers. Mối quan hệ giữa các lớp.  Kế thừa, hợp thành và tổng hợp - 4
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION