Các ngôn ngữ lập trình hướng đối tượng có tồn tại mà không dựa trên lớp không?


44

ngôn ngữ lập trình hướng đối tượng nào không dựa trên mô hình lớp không?


1
Về mặt kỹ thuật, C. Mặc dù định hướng là một sự kéo dài trong ý nghĩa của ngôn ngữ làm cho nó dễ dàng. Tôi biết đó không phải là loại câu trả lời mà bạn đang tìm kiếm, nhưng nếu bạn quan tâm xem làm thế nào C có thể làm điều đó, nó có thể cung cấp một số cái nhìn sâu sắc về những gì các lớp thực sự làm và cách tiếp cận thay thế có thể hoạt động.
kylben

4
@kylben: "Định hướng" là một sự kéo dài chưa từng thấy. Bạn có thể bludgeon C thành hành vi hướng đối tượng. Bạn không thể làm cho nó được định hướng theo cách đó.
David Thornley

Câu trả lời:


74

Theo như tôi biết, Tự là ngôn ngữ gốc đã phát minh ra mô hình "không có lớp học" dựa trên các nguyên mẫu . Nó đã tồn tại (trong giai đoạn thử nghiệm) vào những năm 1980 và đẩy việc sử dụng kiểu mẫu thanh lịch của Smalltalk đến mức cực đoan, sao cho các lớp bị loại bỏ hoàn toàn.

Nó ảnh hưởng đến tất cả các ngôn ngữ OO "không có lớp" khác mà tôi biết:

  • Javascript nổi bật nhất,
  • ngôn ngữ và môi trường lập trình cổ điển Squeak (được xây dựng trên đỉnh Smalltalk)
  • ngôn ngữ kịch bản đa mô hình Lua .

2
@Adam: không cần gõ tĩnh, có phải TẤT CẢ chỉ là cú pháp không?
kevin cline

5
@DeadMG Ngôn ngữ OO không phải là ngôn ngữ cho phép bạn thực hiện các ý tưởng OO mà là ngôn ngữ phù hợp với bạn :)
Piotr Dobrogost

4
Trên thực tế, cả Simula (1960) và Smalltalk-71 (cũng như Smalltalk-72) đều không có lớp học, trước đó, bản thân có trước ba thập kỷ. Các lớp học chỉ được thêm vào trong Simula-67 và Smalltalk-74 (và Alan Kay coi chúng là một sai lầm, hay chính xác hơn là một điều ác cần thiết).
Jörg W Mittag

2
@kevincline: Không chắc chắn những gì bạn dựa trên đó; OO và gõ tĩnh hoàn toàn trực giao.
Paul Biggar

2
Ngoài Simula (đã thực hiện mô hình lớp học) Hương vị được giới thiệu tại MIT vào năm 1979, và là tiền thân của CLOS, cả hai đều có trước Bản thân.
Matthew Flynn

32

Các ngôn ngữ như JavaScript dựa trên các nguyên mẫu , trong đó hành vi được sử dụng lại bằng cách nhân bản các đối tượng hiện có. Bài viết Wikipedia mà tôi liên kết để chỉ ra rằng Lua, ActionScript và một số ngôn ngữ khác tuân theo mô hình này.


2
Bất kỳ biến thể ECMAScript đều sử dụng mô hình nguyên mẫu.
zzzzBov

Vâng, hầu như bất kỳ biến thể. ActionScript (ngôn ngữ Flash) sử dụng các lớp, mặc dù VM cơ bản có thể đang triển khai chúng theo các nguyên mẫu.
mjfgates

@mjfgates, Actioncript 2 từng là ECMAScript dựa trên và giống với Javascript rất nhiều. Actioncript 3 đang di chuyển ra khỏi đó, nhưng vẫn giữ bản chất năng động của nó. Bạn có thể gõ mạnh / yếu bất kỳ biến nào vì về bản chất mọi thứ đều là Object.
J_A_X

13

Ngôn ngữ lập trình hướng đối tượng phổ biến nhất trên thế giới không có các lớp, nó được gọi là Javascript và là nguyên mẫu dựa trên: http://en.wikipedia.org/wiki/Prototype-basing_programming


11
"Ngôn ngữ lập trình hướng đối tượng phổ biến nhất trên thế giới"? Tôi không chắc chắn về tuyên bố đó.
Thomas Owens

8
@ThomasOwens, do có trên web, bạn có thể dễ dàng nói rằng mọi nền tảng hỗ trợ web hiện đại (bao gồm cả thiết bị di động) đều có trình thông dịch JavaScript đi kèm. Đó là một trường hợp rất mạnh mà nó hiện là ngôn ngữ dựa trên nguyên mẫu phổ biến nhất trong sự tồn tại. (trừ khi bạn nghĩ rằng bạn có thể đưa ra một đối số tương tự cho "TỰ
TIN

1
Javascript chắc chắn là một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất trên thế giới, nhưng tôi hy vọng hầu hết các cách sử dụng là mệnh lệnh hoặc thủ tục đơn giản, có thể là một chút lập trình hướng theo khía cạnh (gọi lại? AJAX? Xử lý sự kiện?) Ở đây và ở đó, vì vậy, gọi javascript là 'ngôn ngữ OOP phổ biến nhất' không hoàn toàn hợp lý.
tdammers

9
Tôi cũng sẽ nói "có mặt ở khắp mọi nơi" để bỏ qua một cuộc thảo luận về giá trị của sự phổ biến của nó.
Anthony Pegram

3
@ Stargazer712: Tôi không thích trở thành một kẻ cố chấp ngôn ngữ, nhưng anh ta khẳng định rằng "ngôn ngữ lập trình hướng đối tượng phổ biến nhất trên thế giới [ed: Javascript] không có các lớp". Nó có thể được phân tách thành hai tuyên bố: "Javascript là ngôn ngữ lập trình hướng đối tượng phổ biến nhất" và "Javascript không có các lớp"; cả hai, tôi đồng ý với.
Lie Ryan

6

Hướng đối tượng là một thuật ngữ ô cho một số khái niệm quan trọng chỉ phụ thuộc một phần vào nhau. Ví dụ, thừa kế có thể được khai báo trên cơ sở từng trường hợp giữa các trường hợp chứ không phải giữa các lớp hoặc toàn bộ lớp có thể được biểu diễn bằng một prototypeđối tượng cụ thể, như Thomas đã viết. Nó chỉ bình thường hơn để tách mô tả cấu trúc khỏi việc tạo cá thể. Tương tự, ràng buộc muộn có nghĩa là các đối tượng với cùng một phương thức không nhất thiết phải làm điều tương tự khi nó được gọi và quyết định được đưa ra khi chạy. Điều đó cũng tương tự như vậy với cách tiếp cận dựa trên nguyên mẫu. Và đóng gói về cơ bản là hoàn toàn độc lập với việc các đối tượng của bạn có phải là các thể hiện của các lớp được khai báo hay không.

Điều đó nói rằng, hầu hết các ngôn ngữ OO đều nằm trong trại dựa trên lớp. Nhưng ngay cả sau đó cũng có những thành ngữ làm mờ dòng: thiết kế hướng miền thường dẫn đến các hệ thống trong đó nhận dạng của các đối tượng cụ thể quan trọng hơn nhiều so với sơ đồ lớp tĩnh và các trình trang trí cho phép các đối tượng cùng lớp hoặc giao diện có hành vi khác nhau.


6

Pháo đài là một ngôn ngữ hướng đối tượng dựa trên các đặc điểm thay vì các lớp. Sự khác biệt chủ yếu là trong thành phần thực hiện. Hành vi của một đối tượng (định nghĩa phương thức) vẫn được xác định bởi các khai báo tại một điểm cụ thể trong văn bản chương trình. Vì vậy, theo nghĩa đó, nó tương tự như các hệ thống dựa trên lớp.

Có những tính toán đối tượng (theo Cardelli, tôi nghĩ vậy), hoàn toàn dựa trên đối tượng. Mỗi phương thức là một thành viên thể hiện. Bạn hình thành các đối tượng mới bằng cách lấy nội dung của một đối tượng hiện có và thêm, xóa hoặc thay thế một số thành viên của nó. Nó hơi khác so với các nguyên mẫu, vì đối tượng mới không có liên kết đến đối tượng cũ, chỉ là một số nội dung của nó.

IIRC, có thể lập trình theo cách tương tự bằng Python và các ngôn ngữ hướng băm khác: bạn có thể thêm một hàm làm thành viên thể hiện và sau đó gọi nó là phương thức.


5

Ada, kể từ phiên bản năm 1995, Ada hướng đối tượng, nhưng không giống như nhiều ngôn ngữ OO khác, nó không kết hợp các loại và mô-đun hướng đối tượng thành một cấu trúc gọi là "lớp". Thay vì khai báo một loại là "lớp Foo" và đặt tất cả các khai báo phương thức liên quan bên trong khai báo lớp, bạn khai báo một gói và khai báo loại (dưới dạng a record) và các thứ khác trong gói. Nó không "không có lớp" theo cách mà một số ngôn ngữ được đề cập khác, đó chỉ là một cách tổ chức mọi thứ hơi khác.

Các tính năng hướng đối tượng của Ada 95 đã được thêm vào phiên bản ngôn ngữ 1983 hiện có; nó đã mở rộng các bản ghi hiện tại và các cấu trúc gói để hỗ trợ kế thừa et al.


đó là những gì tôi nhớ, bạn cũng cần chuyển hồ sơ của mình cho từng chức năng thành viên
Nikko

@Nikko: Đó là những gì xảy ra đằng sau hậu trường trong mọi ngôn ngữ hướng đối tượng và khá rõ ràng trong Python và CLOS (lisp chung).
Marcin

5

Io là một ngôn ngữ hướng đối tượng dựa trên nguyên mẫu khác. Nó thực sự lấy cảm hứng từ một số ngôn ngữ đã được đề cập trong các câu trả lời khác.

Io là một ngôn ngữ lập trình dựa trên nguyên mẫu động. Các ý tưởng trong Io hầu hết được lấy cảm hứng từ Smalltalk (tất cả các giá trị là các đối tượng), Tự (dựa trên nguyên mẫu), NewtonScript (kế thừa khác biệt), Act1 (diễn viên và tương lai cho đồng thời), Lisp (mã là cây có thể kiểm tra / sửa đổi thời gian chạy) và Lua (nhỏ, có thể nhúng).


4

Erlang. Và vâng, Erlang một ngôn ngữ hướng đối tượng, vì nó đáp ứng cả ba điểm của định nghĩa về OO.

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.