2010-07-28 81 views
6

C# Hỗ trợ 4 tính năng cơ bản của ngôn ngữ hướng đối tượng:C# là ngôn ngữ lập trình hướng đối tượng 100%?

  1. Abstraction
  2. Encapsulation
  3. Polymorphism
  4. Inheritance

Tôi có thể nói C# là một ngôn ngữ lập trình hoàn toàn hướng đối tượng? Tại sao?

+14

Bạn có thể nói điều đó. Nó không có nghĩa là bất cứ điều gì bằng tiếng Anh. –

+0

Bạn có nghĩa là C# _ ** là ** _ 100% Ngôn ngữ lập trình hướng đối tượng không? Đó có phải là câu hỏi không? –

+0

Tôi đã điều chỉnh tiếng Anh. –

Trả lời

20

Nó phụ thuộc vào định nghĩa của bạn về "Object Oriented Programming Language".
Sử dụng định nghĩa của bạn, vâng C# đáp ứng 100% các yêu cầu:

  1. Abstraction
  2. Encapsulation
  3. Polymorphism
  4. Inheritance

Tuy nhiên, C# chứa các tính năng mà không đúng "Hướng đối tượng" chẳng hạn như

  • Enums
  • Giá trị các loại
  • phương pháp tĩnh
  • lớp tĩnh

Vì vậy, tôi sẽ nói rằng, không phụ thuộc vào định nghĩa bạn muốn sử dụng, C# không phải là một tinh khiết Ngôn ngữ lập trình hướng đối tượng.

+0

Vậy định nghĩa thực tế của ngôn ngữ lập trình hướng đối tượng là gì? – chanchal1987

+3

Nếu chỉ tôi biết ý của anh ấy là gì bởi Abstraction. –

+0

@Steven - Ai biết được. Vì C# có các lớp trừu tượng và cho phép một người viết "trừu tượng hóa" (giống như bất kỳ ngôn ngữ lập trình nào), sau đó tôi sẽ nói rằng nó đáp ứng yêu cầu mơ hồ này. – Greg

0

Một số người theo chủ nghĩa thuần túy sẽ nhấn mạnh rằng C# không hoàn toàn hướng đối tượng vì thiếu nhiều kế thừa.

+1

Ngôn ngữ nào ở đó cho phép thừa kế nhiều lần và làm thế nào để chúng có được xung quanh vấn đề kim cương? –

+0

Thiếu nhiều thừa kế không loại trừ C# như hướng đối tượng Nó chỉ là một tính năng bổ sung của các ngôn ngữ khác như C –

+0

Carlos: Không chắc chắn tôi không đồng ý với bạn. Chỉ cần nói rằng chế độ * purist * yêu cầu nhiều thừa kế, đó là báo cáo một sự kiện. –

3

Không ai biết "100% hướng đối tượng" nghĩa là gì. Có lẽ C# không phải vì không phải mọi thứ đều là một đối tượng.

Một số điều mà không phải là các đối tượng:

  1. khối mã. Đúng, bạn có thể có một đối tượng như một Func mà là một khối mã. Nhưng trong một số ngôn ngữ, tất cả các mã thực sự là đối tượng.
  2. nguyên thủy (int, float, double, ngắn, vv)
  3. chức năng
+2

Có gì * không * một đối tượng? –

+1

@Steven Sudit: con trỏ không được quản lý không phải là đối tượng afaik. – ShdNx

+0

@ShdNx: Nhưng chúng ta có nên xem xét mã không được quản lý như một phần thực của C# hay chỉ là phần mở rộng để làm cho C# có thể tương tác với các hệ thống bên ngoài (có thể không hướng đối tượng)? –

2

Rất nhiều tính năng làm cho C# không hoàn toàn hướng đối tượng. Tuy nhiên tôi không tin bất kỳ ngôn ngữ nào là 100% "hướng đối tượng" và (gần như?) Tất cả các ngôn ngữ đều có ít nhất một chút mô hình. Ví dụ, đại biểu. A very biased source chỉ ra rằng các đại biểu, một cấu trúc trong C# mà tôi yêu thích, không phải là "công dân hạng nhất" trong số các đối tượng. Java không hỗ trợ đa thừa kế nhưng tôi tin rằng đó là ngôn ngữ hướng đối tượng nhất. C++ làm nhưng rõ ràng không phải là 100% hướng đối tượng, như một chương trình C++ dựa trên hàm 100% có thể dễ dàng được viết (chỉ biên dịch gần như bất kỳ chương trình C nào).
Nó phụ thuộc nhiều hơn vào việc sử dụng ngôn ngữ so với ngôn ngữ. Đó là theo định hướng đối với các đối tượng nhưng không bao gồm độc quyền các đối tượng, giống như các ngôn ngữ khác. Sẽ trả lời câu hỏi này giúp bất cứ ai viết mã tốt hơn đáng kể? Cá nhân tôi không nghĩ như vậy - Richard Feynman nói "Tôi đã học được rất sớm sự khác biệt giữa việc biết tên của một cái gì đó và biết điều gì đó." Nó không quan trọng nếu nó có thể được gọi là "hướng đối tượng" như bất cứ điều gì từ Perl để Python để CIL để Ada có tính năng hướng đối tượng, và C# có tính năng không hướng đối tượng.

+0

Tôi nghĩ Ruby có nhiều hướng đối tượng hơn Java .... – tster

+0

không phải là ngôn ngữ OO thuần túy Scala? –

0

Có, bạn có thể nói rằng C# là một ngôn ngữ hướng đối tượng đầy đủ. Hãy nghĩ về nó theo cách này, nó không chỉ hỗ trợ bốn tiêu chí của OOP, nó còn đòi hỏi về cơ bản tất cả các cấu trúc của bạn được đóng gói trong các đối tượng (enums hoặc các kiểu giá trị không phải là OOP thuần túy sẽ không ảnh hưởng đến tôi như một ngoại lệ đặc biệt quan trọng) . Tức là, C# không cho phép bạn phát triển bên ngoài phương pháp OOP trong bất kỳ cách nào có ý nghĩa . Nơi mọi người đôi khi nói một ngôn ngữ không thực sự là OOP là nơi định hướng đối tượng là tùy chọn - chẳng hạn như C++, nơi bạn có thể phát triển trong C thuần túy nếu bạn muốn.

Một lưu ý: Steven chỉ ra rằng nó không hỗ trợ đa kế thừa. Tuy nhiên, điều đó không loại trừ nó: OOP không phụ thuộc vào sự bao gồm của tính năng này (và kinh nghiệm đã dạy chúng tôi rằng nó là, tốt nhất, một phước lành hỗn hợp). Điều đó sẽ giống như nói rằng một chiếc xe không phải là một "chiếc xe" trừ khi nó có một máy ảnh sao lưu kể từ khi một số chiếc xe có chúng.

Các vấn đề liên quan