Tôi vẫn còn nhiều năm nữa để nắm bắt hoàn toàn sự khác biệt giữa một lớp trừu tượng và một giao diện. Mỗi khi tôi nghĩ rằng tôi nắm được các khái niệm cơ bản, tôi lại tìm kiếm trên stackexchange và tôi lùi lại hai bước. Nhưng một vài suy nghĩ về chủ đề và câu hỏi của OP:
Đầu tiên:
Có hai cách giải thích chung về giao diện:
Giao diện là danh sách các phương thức và thuộc tính mà bất kỳ lớp nào cũng có thể thực hiện và bằng cách triển khai giao diện, một lớp đảm bảo các phương thức đó (và chữ ký của chúng) và các thuộc tính đó (và các kiểu của chúng) sẽ có sẵn khi "giao tiếp" với lớp đó hoặc một đối tượng của lớp đó. Một giao diện là một hợp đồng.
Giao diện là các lớp trừu tượng không / không thể làm gì. Chúng rất hữu ích vì bạn có thể triển khai nhiều hơn một, không giống như các lớp cha có nghĩa. Giống như, tôi có thể là một đối tượng của lớp BananaBread và kế thừa từ BaseBread, nhưng điều đó không có nghĩa là tôi cũng không thể thực hiện cả giao diện IWithNuts và ITastesYummy. Tôi thậm chí có thể thực hiện giao diện IDoesTheDishes, vì tôi không chỉ là bánh mì, phải không?
Có hai cách giải thích chung về một lớp trừu tượng:
Một lớp trừu tượng là, bạn biết, điều không phải là điều có thể làm. Nó giống như, bản chất, không thực sự là một điều thực sự. Đợi một chút, điều này sẽ giúp. Một chiếc thuyền là một lớp trừu tượng, nhưng một Du thuyền Playboy gợi cảm sẽ là một lớp con của BaseBoat.
Tôi đã đọc một cuốn sách về các lớp trừu tượng và có lẽ bạn nên đọc cuốn sách đó, bởi vì bạn có thể không hiểu nó và sẽ làm sai nếu bạn không đọc cuốn sách đó.
Nhân tiện, cuốn sách Citers luôn có vẻ ấn tượng, ngay cả khi tôi vẫn bước đi bối rối.
Thứ hai:
Trên SO, ai đó đã hỏi một phiên bản đơn giản hơn của câu hỏi này, câu hỏi kinh điển, "tại sao lại sử dụng giao diện? Sự khác biệt là gì? Tôi còn thiếu gì?" Và một câu trả lời đã sử dụng một phi công không quân làm ví dụ đơn giản. Nó không hoàn toàn hạ cánh, nhưng nó đã gây ra một số ý kiến tuyệt vời, một trong số đó đã đề cập đến giao diện IFlyable có các phương thức như Take Offer, PilotEject, v.v. Và điều này thực sự đã nhấp vào tôi như một ví dụ thực tế về lý do tại sao giao diện không chỉ hữu ích, nhưng rất quan trọng Một giao diện làm cho một đối tượng / lớp trực quan, hoặc ít nhất mang lại ý nghĩa của nó. Một giao diện không vì lợi ích của đối tượng hoặc dữ liệu, mà là thứ cần tương tác với đối tượng đó. Trái cây cổ điển-> Apple-> Fuji hoặc Shape-> Tam giác-> Các ví dụ tương đương về thừa kế là một mô hình tuyệt vời để hiểu về mặt phân loại một đối tượng nhất định dựa trên hậu duệ của nó. Nó thông báo cho người tiêu dùng và bộ xử lý về các phẩm chất, hành vi chung của nó, cho dù đối tượng là một nhóm vật, sẽ vòi hệ thống của bạn nếu bạn đặt sai vị trí hoặc mô tả dữ liệu cảm giác, đầu nối đến một kho lưu trữ dữ liệu cụ thể hoặc dữ liệu tài chính cần thiết để làm bảng lương.
Một đối tượng Máy bay cụ thể có thể có hoặc không có phương pháp hạ cánh khẩn cấp, nhưng tôi sẽ tức giận nếu tôi giả sử nó khẩn cấp như mọi đối tượng có thể bay được khác chỉ để thức dậy trong DumbPlane và biết rằng các nhà phát triển đã đi với quickLand bởi vì họ nghĩ rằng tất cả đều giống nhau Cũng giống như cách tôi sẽ nản lòng nếu mọi nhà sản xuất ốc vít có cách giải thích riêng về độ kín đúng hoặc nếu TV của tôi không có nút tăng âm lượng trên nút giảm âm lượng.
Các lớp trừu tượng là mô hình thiết lập những gì mà bất kỳ đối tượng hậu duệ nào cũng phải có để định tính là lớp đó. Nếu bạn không có tất cả các phẩm chất của một con vịt, thì việc bạn có giao diện IQuack được thực hiện không thành vấn đề, bạn chỉ là một con chim cánh cụt kỳ lạ. Giao diện là những thứ có ý nghĩa ngay cả khi bạn không thể chắc chắn bất cứ điều gì khác. Jeff Goldblum và Starbuck đều có thể lái tàu vũ trụ của người ngoài hành tinh vì giao diện tương tự nhau.
Thứ ba:
Tôi đồng ý với đồng nghiệp của bạn, bởi vì đôi khi bạn cần thực thi một số phương pháp ngay từ đầu. Nếu bạn đang tạo ORM Bản ghi hoạt động, nó cần một phương thức lưu. Đây không phải là lớp con có thể được khởi tạo. Và nếu giao diện ICRUD đủ di động để không được ghép riêng với một lớp trừu tượng, thì các lớp khác có thể được triển khai để làm cho chúng đáng tin cậy và trực quan cho bất kỳ ai đã quen thuộc với bất kỳ lớp con cháu nào của lớp trừu tượng đó.
Mặt khác, đã có một ví dụ tuyệt vời trước đó khi không nhảy vào việc buộc một giao diện vào lớp trừu tượng, bởi vì không phải tất cả các loại danh sách sẽ (hoặc nên) thực hiện giao diện hàng đợi. Bạn nói kịch bản này xảy ra một nửa thời gian, điều đó có nghĩa là bạn và đồng nghiệp của bạn đều sai một nửa thời gian, và do đó, điều tốt nhất để làm là tranh luận, tranh luận, cân nhắc và nếu họ tỏ ra đúng, hãy thừa nhận và chấp nhận khớp nối . Nhưng đừng trở thành một nhà phát triển tuân theo triết lý ngay cả khi đó không phải là nhà phát triển tốt nhất cho công việc.