Ảo hay trừu tượng thuần túy, những gì trong một cái tên?


15

Trong khi thảo luận một câu hỏi về các hàm ảo trên Stack Overflow, tôi tự hỏi liệu có bất kỳ tên chính thức nào cho các hàm ảo thuần túy (trừu tượng) và không thuần túy hay không.

Tôi luôn dựa vào wikipedia để biết thông tin của mình, trong đó tuyên bố rằng các hàm ảo thuần túy và không thuần túy là thuật ngữ chung. Thật không may, bài viết không sao lưu nó với nguồn gốc hoặc tài liệu tham khảo.

Để trích dẫn câu trả lời của Jon Skeet cho câu trả lời của tôi rằng thuần túy và không thuần khiết là thuật ngữ chung được sử dụng:

@Steven: Hmm ... có thể, nhưng tôi chỉ từng thấy nó trong bối cảnh của C ++ trước đây. Tôi nghi ngờ bất cứ ai nói về họ có khả năng có nền tảng C ++ :)

Có phải các thuật ngữ bắt nguồn từ C ++, hoặc lần đầu tiên chúng được định nghĩa hoặc triển khai bằng ngôn ngữ trước đó và chúng có phải là thuật ngữ khoa học 'chính thức' không?

CẬP NHẬT:

Frank Shearar đã cung cấp một liên kết đến mô tả về Ngôn ngữ cơ sở chung của SIMULA 67 (1970). Ngôn ngữ này dường như là ngôn ngữ đầu tiên giới thiệu các từ khóa OO là lớp , đối tượng và cũng là ảo như một khái niệm chính thức. Nó không định nghĩa thuần túy / không thuần khiết hay trừu tượng , nhưng nó hỗ trợ các khái niệm .

Ai định nghĩa chúng?


1
Có thể tìm thấy điều thú vị này ... objectmentor.com/resource/articles/abcpvf.pdf
Aaron McIver

2
các hàm ảo, kế thừa ảo, các bảng ảo - không có bất kỳ lời giải thích thực sự nào về những gì làm cho chúng "ảo". Tôi biết các quy tắc, nhưng tại sao từ đó? Xét cho cùng, một chức năng "ảo" cũng giống như bất kỳ chức năng nào khác - nó chỉ cần một tra cứu ràng buộc muộn, là tất cả. Có lẽ Stroustrup chỉ thực sự thích từ này. Tôi nghĩ rằng các lớp là trừu tượng (không thuần túy), trong khi các phương thức có thể là thuần túy (nhưng không trừu tượng). Mặc dù có thể tôi đã làm điều đó lên.
Steve314

3
@ Steve314, đó không phải là Stroustrup - rõ ràng chúng được gọi như thế này đã có trong Simula .
Péter Török

Câu trả lời:


9

Nygaard và Dahl lần đầu tiên sử dụng thuật ngữ này, trong SIMULA 67 Ngôn ngữ cơ sở chung . Xem trong phần 2.1, ví dụ, và phần 2.2.3. (Theo như tôi có thể nói ít nhất. Nhưng này, theo như OOP quan tâm, có lẽ đây là cách sử dụng đầu tiên của thuật ngữ này.)


3
Simula là ngôn ngữ OO đầu tiên, AFAIK, vì vậy nó có lần đầu tiên sử dụng rất nhiều thuật ngữ trong ngữ cảnh OOP. Nó ảnh hưởng lớn đến Stroustrup, người ban đầu chỉ muốn một ngôn ngữ có hiệu quả C và các lớp Simula.
David Thornley

Tôi đang lướt qua bài báo này, và vâng, nó dường như là lần đầu tiên, vì họ đang giới thiệu 'lớp' và 'đối tượng'.
Steven Jeuris

2
Vì vậy, sau một thời gian lãng phí khi đọc định nghĩa SIMULA 67. Simula 67 đặt ra 'ảo' cùng với 'lớp', 'đối tượng', 'ẩn', 'gọi theo giá trị', 'gọi theo tham chiếu' vào năm 1970. Không có dấu hiệu 'thuần khiết', 'không rõ ràng' hoặc 'trừu tượng'.
Steven Jeuris

5
"Lãng phí" có vẻ như là một từ kỳ quặc để sử dụng để mô tả việc đọc một trong những bài báo chuyên đề của lĩnh vực này.
Frank Shearar

7

Vì vậy, ... tôi đã thực hiện một nghiên cứu nhỏ. Điều gì sau đây là một bài học lịch sử nhỏ cho những người quan tâm. :) Bỏ qua kết luận ở phía dưới nếu bạn chỉ quan tâm đến câu trả lời.

1967 :

SIMULA 67 , ngôn ngữ lập trình hướng đối tượng đầu tiên định nghĩa các từ khóa là lớp , đối tượng , gọi theo tham chiếu , gọi theo giá trịảo .

Hệ thống thừa kế của SIMULA ban đầu được biết đến bằng một tên khác, ghép nối (và sau này được gọi là tiền tố ), đề cập đến thực tế là mã của các siêu kiểu đã được sao chép và 'ghép' với mã của các kiểu con. Sau đó, một hình thức khác của hệ thống thừa kế đã xuất hiện, ủy quyền , trong đó các cuộc gọi được ủy quyền bằng cách tham chiếu đến loại chính xác.

Ảo rất có thể đề cập đến quá trình cần được thực hiện để gửi một cuộc gọi đến việc thực hiện chính xác bằng cách sử dụng bảng phương thức ảo . Đó là ảo so với việc thực hiện cố định / cụ thể.

1971 :

Niklaus Wirth, viết về một khái niệm được định nghĩa là Tinh chỉnh từng bước . Nó cơ bản giải thích làm thế nào để phân chia một chương trình trong các giải pháp một phần mà trên đó có thể được mở rộng.

1974 :

Đây là giấy sớm nhất tôi thấy mà tiền xu thuật ngữ trừu tượng kiểu dữ liệu bằng Barbara Liskov .

Một kiểu dữ liệu trừu tượng định nghĩa một lớp các đối tượng trừu tượng được đặc trưng hoàn toàn bởi các hoạt động có sẵn trên các đối tượng đó. Điều này có nghĩa là một loại trừu tượng có thể được xác định bằng cách xác định các hoạt động đặc trưng cho loại đó. Khi một lập trình viên sử dụng một đối tượng dữ liệu trừu tượng, anh ta chỉ quan tâm đến hành vi mà đối tượng đó thể hiện chứ không liên quan đến bất kỳ chi tiết nào về cách thức hành vi đó đạt được bằng cách thực hiện.

Bài viết này cũng định nghĩa một cụm hoạt động dường như chỉ định những gì chúng ta biết bây giờ là một giao diện .

Thuật ngữ khoa học thú vị (bài báo năm 1996):

Kế thừa : một cơ chế cấp thấp hơn mà theo đó các đối tượng hoặc lớp có thể chia sẻ hành vi hoặc dữ liệu.

Subtyping : thể hiện chuyên môn hóa khái niệm. Một hình thức kế thừa cụ thể, còn được gọi là kế thừa giao diện .

Nguyên tắc trừu tượng : Quá trình tổ chức kiến ​​thức của chúng ta về một miền ứng dụng thành các bảng xếp hạng thứ tự các thứ tự trừu tượng, để có được sự hiểu biết tốt hơn về các hiện tượng cần quan tâm.

Trừu tượng được thực hiện một phần : trừu tượng có định nghĩa đã bị bỏ lại không đầy đủ.

Các lớp trừu tượng : Thuật ngữ cụ thể cho một lớp được triển khai một phần trong các hệ thống hướng đối tượng.

Kế thừa không hạn chế : Cho phép các hoạt động được xác định lại (hoặc thậm chí loại bỏ) trong các lớp con.

Kế thừa nghiêm ngặt : Kế thừa tương thích hành vi.

Kết luận :

Lớp trừu tượng là thuật ngữ chung nhất để sử dụng trong các hệ thống hướng đối tượng. Có vẻ như các hàm ảo thuần túy và không thuần túy chỉ bắt nguồn từ C ++. Ví dụ, cuộc phỏng vấn với Stroustrup này có vẻ như ông đã phát minh ra các điều khoản. Bài báo khoa học sử dụng thuật ngữ chung hơn.

Ảo bắt nguồn từ SIMULA, khiến cho việc sử dụng của nó được phổ biến rộng rãi, nhưng nó không phải là một thuật ngữ chung. Nó đã xác định chi tiết thực hiện. Nói về các loại thừa kế là phù hợp hơn. Theo mặc định, không ảo tương ứng với thừa kế nghiêm ngặt theo mặc định, trong khi ảo theo mặc định tương ứng với thừa kế không hạn chế .

Bất cứ ai quan tâm đến việc điều chỉnh các mục wikipedia ? :)


Trước Barbara Liskov, Dijkstra cũng đã có vài điều để nói về "THÀNH PHẦN CHƯƠNG TRÌNH BƯỚC" , đây cũng có thể là một tài nguyên có liên quan.
Steven Jeuris

4

Trong C ++, các hàm thành viên bị ràng buộc động và do đó có thể bị ghi đè bởi một lớp con được gọi là "ảo". Các hàm ảo hoàn toàn phải được ghi đè được gọi là "thuần ảo". Lưu ý rằng một hàm ảo thuần túy có thể có một cơ thể, mặc dù thường thì nó không có. Một lớp có ít nhất một hàm ảo thuần được gọi là "trừu tượng" và không thể được khởi tạo, chỉ có nguồn gốc từ.

Tôi đoán lý do tại sao các hàm ảo được gọi là ảo là thực tế là nó không biết chức năng thực tế nào sẽ được gọi vào thời gian biên dịch. Theo một nghĩa nào đó, một hàm gọi ảo "không tồn tại" tại thời điểm biên dịch.

Tôi cũng đoán rằng lý do thuật ngữ "trừu tượng" được sử dụng cho một lớp có chức năng ảo thuần túy là bạn không thể có bất kỳ đối tượng nào của lớp đó. Theo một nghĩa nào đó, nó là một khái niệm trừu tượng khác xa với thế giới cụ thể của các vật thể.

Biên tập: Các ngôn ngữ khác.

Theo như câu hỏi về thuật ngữ "ảo" nói chung như thế nào, thì đây là hai xu của tôi. Trong Smalltalk, tất cả các hàm đều sử dụng liên kết động, vì vậy chúng đều là ảo và không cần một thuật ngữ đặc biệt hoặc từ khóa ngôn ngữ. Trong Java, nếu tôi không nhầm, trình biên dịch sẽ tự động quyết định có nên sử dụng liên kết động hay không, theo như lập trình viên có liên quan thì không có sự phân biệt và do đó không có từ khóa "ảo".

Trong C ++, việc phân biệt giữa ảo và không ảo là cần thiết, bởi vì người lập trình phải quyết định khi nào nên sử dụng liên kết động để tiết kiệm chi phí khi không cần thiết.


1
+1: Ngoài ra, "Trừu tượng" áp dụng cho nhiều ngôn ngữ. "Ảo" không.
S.Lott

@ S.Lott: Toàn bộ câu hỏi là ảo hay không là một thuật ngữ chung. Theo như tôi có thể nói bây giờ, ảo không áp dụng cho nhiều ngôn ngữ và lần đầu tiên được đặt ra bởi Simula. Câu hỏi vẫn còn về tinh khiết / không tinh khiết và trừu tượng.
Steven Jeuris

@Steven Jeuris: "ảo có áp dụng cho nhiều ngôn ngữ" không? Có thật không. Cho đến nay, nó dường như là C, C ++ và Simula. Nó chắc chắn không áp dụng cho Python dù chỉ một chút. Nó dường như không áp dụng cho Java.
S.Lott

Nó áp dụng cho Object Pascal / Delphi. Delphi có một khái niệm bổ sung - dynamic- là một loại phương thức ảo giao dịch không gian theo thời gian: chúng chiếm ít không gian hơn và thực thi chậm hơn so với virtualcác phương thức.
Frank Shearar

2
@Steven Jeuris: "ảo theo mặc định" không giống như sử dụng "ảo" để mô tả các hàm trừu tượng. Tôi nghĩ rằng những người nói rằng "tất cả các chức năng là ảo" đang áp dụng khái niệm C ++ cho một ngôn ngữ khác. Và tôi nghĩ họ đang làm nó không đúng cách. Vì tất cả các hàm phương thức là ảo trong Python, chủ đề không bao giờ được đề cập bằng cách sử dụng "ảo" ngoại trừ ở những nơi như Stack Overflow để áp dụng khái niệm C ++ cho Python. Tôi nghĩ rằng ảo được áp dụng không đúng cách trong những trường hợp đó, vì các tài liệu ngôn ngữ Python không sử dụng từ này.
S.Lott
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.