Khi nào thực hiện và gia hạn? [đóng cửa]


90
  • Khi nào nên implementhoặc extendđược sử dụng?
  • Một số ví dụ trong thế giới thực là gì?

Điều này có chính xác?

Việc triển khai dường như là một cách để thực thi rằng một số phương thức nhất định tồn tại trong một lớp và rằng các lời gọi hàm của phương thức này được định dạng đúng. Thực hiện không phải là một cách để truyền các biến hoặc "cài đặt" cho lớp?

Kịch bản thực tế mong đợi: Tôi có một nền tảng thương mại điện tử có nhiều lớp thanh toán đều tuân theo cùng một thiết kế. Khi một lớp thanh toán mới được thêm vào, thực sự dễ dàng tuân theo thiết kế đã xác định của lớp interfaceđể đảm bảo rằng tất cả các bit và mảnh đều ở đó, ngay từ đầu.

Việc mở rộng các lớp làm cho lớp mở rộng (con?) Kế thừa mọi thứ từ lớp cha của nó ngoại trừ các phương thức & biến được khai báo là private?

Kịch bản thực tế mong đợi: Tôi có một lớp được gọi sessionsvới hai lớp con được đặt tên sessioncookiesdatabasesessions. sessioncookiesdatabasesessionscùng nhau kế thừa một số tùy chọn cấu hình lẫn nhau từ các phiên mẹ của chúng, giúp dễ dàng thay đổi tùy chọn cấu hình để ảnh hưởng đến tất cả các loại lưu trữ dữ liệu khách truy cập cuối cùng.


1
Tôi khuyên bạn nên đọc về kế thừa.
Rafe Kettler

Câu trả lời:


64

Kế thừa hữu ích để giảm số lượng mã bạn viết lại. Nếu bạn có một số lớp với một vài phương thức hoặc trường phổ biến, thay vì xác định lặp đi lặp lại các phương thức và trường này, bạn có thể nhân tố chúng thành một lớp cơ sở và để mỗi lớp con mở rộng lớp cơ sở đó.

Giao diện (và implements) hữu ích khi bạn muốn xác định một giao thức chung cho cách một nhóm đối tượng sẽ hoạt động. Ví dụ: bạn có thể muốn bắt buộc rằng các đối tượng có thể so sánh được có thể được so sánh để bình đẳng và băm, v.v.

Sử dụng kế thừa cuối cùng là một lựa chọn thiết kế. Hãy để ý các trường hợp bạn xác định các phương thức giống nhau trên một số lớp; đó là những trường hợp tuyệt vời mà bạn có thể đưa các phương thức đó vào một lớp cơ sở. Điều tương tự cũng xảy ra đối với các lớp có một số đặc điểm giống nhau: bạn có thể đảm bảo tính nhất quán bằng cách đặt các đặc điểm đó vào một giao diện để được thực hiện bởi các lớp liên quan đó.

Kế thừa là một khái niệm lớn trong OOP vượt xa chỉ PHP. Tôi khuyên bạn nên đọc bài viết trên wikipedia về sự kế thừa và có lẽ là Mẫu thiết kế của Gang of Four .

Tôi tin rằng cách hiểu của bạn về thừa kế chủ yếu là đúng. Bước tiếp theo sẽ là sử dụng nó trong sản xuất.


4
Nhiều người hiện nay coi cuốn sách The Gang of Four quá nặng về chất liệu như một lời giới thiệu cho các mẫu thiết kế. Một giải pháp thay thế phổ biến là Head First: Design Patterns giúp đọc nhẹ hơn. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"Hãy để ý các trường hợp bạn xác định các phương thức giống nhau trên một số lớp; đó là những trường hợp tuyệt vời mà bạn có thể đưa các phương thức đó vào một lớp cơ sở." Việc mở rộng một Lớp có lợi ích hơn việc sử dụng một Đặc điểm để xác định các phương thức đó không?
Daniel Weiner

1
"Kế thừa hữu ích để giảm số lượng mã bạn viết lại" - Mục đích của kế thừa là chia sẻ hành vi, không phải mã. Nếu có thể, các đặc điểm là cách để chia sẻ mã hơn là mở rộng một lớp trừu tượng với các lớp cụ thể không có điểm chung. Bạn thường có thể lập mô hình các lớp của mình dưới dạng quan hệ has-a chứ không phải is-a, điều này sẽ tạo điều kiện thuận lợi hơn nữa cho cả khả năng tái sử dụng mã và tính đa hình.
Duncan

12

Triển khai thực hiện:

Giao diện là các lớp trừu tượng, vì vậy bạn chỉ có thể khai báo các thứ. Một lớp thực hiện một giao diện. Bạn có thể triển khai nhiều giao diện.

Mở rộng:

Bạn mở rộng các lớp khi bạn muốn một phiên bản cụ thể hơn của một lớp.

Thí dụ:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Cả Lạc đà và Chó đều là động vật, vì vậy chúng mở rộng Animallớp học. Nhưng chỉ có chó là một loại cụ thể của Animalđiều đó cũng có thể là mộtPet

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.