Tôi nghĩ rằng C là hoàn toàn tốt và phù hợp để thực hiện các khái niệm hướng đối tượng, nhún vai . Hầu hết sự khác biệt mà tôi thấy nó giữa tập hợp mẫu số chung của các ngôn ngữ được coi là hướng đối tượng là bản chất nhỏ và cú pháp theo quan điểm thực dụng của tôi.
Hãy bắt đầu với, giả sử, ẩn thông tin. Trong C, chúng ta có thể đạt được điều đó bằng cách đơn giản là ẩn định nghĩa của cấu trúc và làm việc với nó thông qua các con trỏ mờ. Điều đó mô hình hiệu quả public
so với private
sự khác biệt của các trường dữ liệu như chúng ta nhận được với các lớp. Và nó đủ dễ để làm và hầu như không chống thành ngữ, vì thư viện C tiêu chuẩn phụ thuộc rất nhiều vào việc này để đạt được việc che giấu thông tin.
Tất nhiên, bạn mất khả năng dễ dàng kiểm soát chính xác nơi cấu trúc được phân bổ trong bộ nhớ bằng cách sử dụng các loại mờ, nhưng đó chỉ là một sự khác biệt đáng chú ý giữa, giả sử, C và C ++. C ++ chắc chắn là một công cụ ưu việt khi so sánh khả năng lập trình các khái niệm hướng đối tượng của nó qua C trong khi vẫn duy trì quyền kiểm soát các bố cục bộ nhớ, nhưng điều đó không nhất thiết có nghĩa là Java hay C # vượt trội hơn C về mặt đó, vì hai điều đó làm cho bạn mất hoàn toàn khả năng kiểm soát nơi các đối tượng được phân bổ trong bộ nhớ.
Và chúng ta phải sử dụng một cú pháp fopen(file, ...); fclose(file);
trái ngược với file.open(...); file.close();
nhưng rất lớn. Ai quan tâm chứ? Có lẽ chỉ cần một người nào đó dựa nhiều vào việc tự động hoàn thành trong IDE của họ. Tôi thừa nhận rằng đó có thể là một tính năng rất hữu ích từ quan điểm thực tế, nhưng có lẽ không phải là một tính năng cần thiết cho một cuộc thảo luận về việc liệu một ngôn ngữ có phù hợp với OOP hay không.
Chúng tôi thiếu khả năng thực hiện hiệu quả protected
các lĩnh vực. Tôi sẽ hoàn toàn nộp ở đó. Nhưng tôi không nghĩ có một quy tắc cụ thể có nội dung: " Tất cả các ngôn ngữ OO nên có một tính năng cho phép các lớp con truy cập các thành viên của lớp cơ sở mà các máy khách bình thường vẫn không thể truy cập được ." Bên cạnh đó, tôi hiếm khi thấy các trường hợp sử dụng cho các thành viên được bảo vệ mà ít nhất một chút nghi ngờ về việc trở thành một rào cản bảo trì.
Và tất nhiên chúng ta phải "bắt chước" OO đa hình với các bảng của con trỏ hàm và gợi ý cho họ cho văn năng động với một chút soạn sẵn hơn để khởi tạo những analogical vtables
và vptrs
, nhưng một chút soạn sẵn không bao giờ gây cho tôi nhiều nỗi đau.
Kế thừa là cách tương tự. Chúng ta có thể dễ dàng mô hình hóa điều đó thông qua thành phần, và tại các hoạt động bên trong của trình biên dịch, nó thực hiện cùng một điều. Tất nhiên, chúng tôi mất an toàn loại nếu chúng tôi muốn downcast , và tôi sẽ nói nếu bạn muốn hạ thấp tất cả, xin vui lòng không sử dụng C cho nó bởi vì những điều mọi người làm trong C để giả lập downcasting có thể là khủng khiếp từ một loại quan điểm an toàn, nhưng tôi thà người ta không nhìn xuống cả. Loại an toàn là thứ bạn có thể dễ dàng bắt đầu bỏ lỡ trong C vì trình biên dịch cung cấp rất nhiều thời gian để diễn giải mọi thứ chỉ là bit và byte, hy sinh khả năng bắt lỗi trong thời gian biên dịch, nhưng một số ngôn ngữ được coi là aren hướng đối tượng thậm chí còn gõ tĩnh.
Vì vậy, dunno, tôi nghĩ rằng nó ổn. Tất nhiên, tôi sẽ không sử dụng C để cố gắng tạo ra một cơ sở mã quy mô lớn tuân thủ các nguyên tắc RẮN, nhưng điều đó không nhất thiết là do sự xuất hiện ngắn của nó ở mặt trước hướng đối tượng. Rất nhiều tính năng tôi sẽ bỏ lỡ nếu tôi cố sử dụng C cho mục đích như vậy sẽ liên quan đến các tính năng ngôn ngữ không được coi là điều kiện tiên quyết cho OOP như an toàn loại mạnh, các hàm hủy được tự động gọi khi các đối tượng vượt quá phạm vi, toán tử quá tải, mẫu / generic và xử lý ngoại lệ. Đó là khi tôi thiếu các tính năng phụ trợ mà tôi đạt được cho C ++.