Là vịt gõ một tập hợp của đa hình


17

Từ đa hình trên WIkipedia

Trong khoa học máy tính, tính đa hình là một tính năng ngôn ngữ lập trình cho phép các giá trị của các loại dữ liệu khác nhau được xử lý bằng giao diện thống nhất.

Từ gõ vịt trên Wikipedia

Trong lập trình máy tính với các ngôn ngữ lập trình hướng đối tượng, gõ vịt là kiểu gõ động trong đó tập phương thức và thuộc tính hiện tại của đối tượng xác định ngữ nghĩa hợp lệ, thay vì kế thừa từ một lớp cụ thể hoặc thực hiện giao diện cụ thể.

Giải thích của tôi là dựa trên việc gõ vịt, các phương thức / thuộc tính của đối tượng xác định ngữ nghĩa hợp lệ. Có nghĩa là các đối tượng hình dạng hiện tại xác định giao diện mà nó duy trì.

Từ đa hình, bạn có thể nói một hàm là đa hình nếu nó chấp nhận nhiều loại dữ liệu khác nhau miễn là chúng duy trì một giao diện.

Vì vậy, nếu một hàm có thể loại vịt, nó có thể chấp nhận nhiều loại dữ liệu khác nhau và hoạt động trên chúng miễn là các loại dữ liệu đó có các phương thức / thuộc tính chính xác và do đó duy trì giao diện.

(Việc sử dụng giao diện thuật ngữ không có nghĩa là một cấu trúc mã mà nhiều hơn là một cấu trúc tài liệu mô tả)

  • Mối quan hệ chính xác giữa vịt và đa hình là gì?
  • Nếu một ngôn ngữ có thể loại vịt, điều đó có nghĩa là nó có thể làm đa hình?

1
Không chắc chắn những gì bạn đang tìm kiếm trong một câu trả lời. Bạn đã xác định cả hai chính xác, vì vậy bạn có nhiều câu trả lời dứt khoát như có. Quyết định xem vịt gõ "tính" là đa hình ít nhiều là một câu hỏi triết học, hoặc có thể là một câu hỏi thuật ngữ nếu bạn muốn nói như vậy. Vì vậy, những gì bạn sẽ tìm kiếm trong một câu trả lời?
psr

@psr Về cơ bản tôi đã nói "đây là cách tôi diễn giải nó. Tôi có sai không? Tôi có đúng không? Có những người hàn lâm có thể lặp lại nói nó theo cách này hay cách khác. Có bài viết nào về chủ đề này không?" Về cơ bản chi tiết khác sau đó "gõ vịt là một triển khai / tập hợp con của đa hình" có thể nói gì khác về mối quan hệ?
Raynos

theo như tôi hiểu về homography làm cho vịt gõ bất cứ thứ gì khác ngoài giao diện thống nhất => không phải là đa hình, hoặc ít nhất là không hiểu theo cách Wikipedia định nghĩa nó. Ví dụ door.close()tiger.close()
gnat

4
Gõ vịt là một trường hợp đa hình Ad-hoc . Bạn đang suy nghĩ quá mức này.
yannis

Câu trả lời:


16

Tôi nói rằng đa hình là một đặc điểm chung, có thể được thực hiện theo nhiều cách:

  • kế thừa dựa trên lớp.
  • đối tượng dựa trên nguyên mẫu (có hoặc không có kế thừa)
  • gõ vịt
  • tuân thủ giao diện (như được thực hiện bởi các giao diện của Go và hoàn toàn trên các mẫu C ++)

mỗi trong số chúng cho phép lập trình viên sử dụng một mã với các loại khác nhau, vì vậy tất cả đều thể hiện khái niệm đa hình.


7

Tôi nghĩ vậy:

Cả gõ vịt và đa hình đều là phương tiện của sự gián tiếp / trừu tượng. Đa hình là một khái niệm được thành lập trên các loại và gõ trong khi gõ vịt được thành lập dựa trên hợp đồng.

Với tính đa hình, điều quan trọng là THING là gì và không phải là cách nó hoạt động (hành vi của nó có thể là hậu quả của những gì nó là).

Trong việc gõ vịt, điều quan trọng là cách THING cư xử. Gõ vịt gắn chặt hơn với khái niệm các đối tượng là các tác nhân trao đổi thông điệp, thay vì các đối tượng có một số thuộc tính được xác định.


2
Cái này sai. Đa hình là một chiếc ô khổng lồ bao gồm rất nhiều thứ. Đặc biệt, nó bao gồm gõ vịt. Do đó gõ vịt là một dạng đa hình.
Thomas Eding

Tôi không đồng ý. Kế thừa truyền thống với các phương pháp hành vi có những đặc điểm giống nhau. Nó chỉ an toàn hơn bằng cách rõ ràng về hành vi mà một đối tượng được đảm bảo để thể hiện (không loại trừ các hành vi khác!)
marstato

6

Câu trả lời là .

Duck Typing là một trường hợp đặc biệt của kiểu gõ động và ngay cả khi gõ động mỗi se không thể được coi trực tiếp là đa hình (vì nó chỉ là thuộc tính của ngôn ngữ để thực hiện kiểm tra kiểu trong thời gian chạy thay vì vào thời gian biên dịch), các kỹ thuật thường dưới sự đánh máy động, ràng buộc muộn và công văn động như vậy là đặc trưng cho đa hình .


Vấn đề với bài viết Wikipedia và hiện tại có bao nhiêu người sử dụng thuật ngữ này là nó không định nghĩa việc gõ vịt có nghĩa là gì khi tôi lần đầu tiên nhìn thấy nó (cụ thể là một hình thức gõ) mà thay vào đó, có thể chỉ cần gọi các phương thức và ném lỗi thời gian chạy khi chúng không được xác định. Đó không phải là gõ mà là thiếu gõ, như Eric Lippert giải thích .
rebierpost

1

Gõ vịt không hoàn toàn là một tập hợp con của đa hình, vì đa hình đòi hỏi phải có sự chứng minh, bị mất khi gõ vịt. Vì vậy, gõ vịt có cơ hội "thực hiện" một "giao diện" không phải vì nó có ý nghĩa ngữ nghĩa mà vì bạn có cùng chữ ký. Nếu gõ vịt là một tập hợp con của đa hình thì nó sẽ có tất cả các thuộc tính của đa hình, bao gồm cả khai báo rõ ràng.

Gõ vịt cũng không thực sự là một thực thi của đa hình, nó là một phần của một hệ thống loại khác. Thông thường, bạn liên kết việc gõ vịt với một ngôn ngữ động đi trước và truyền một thông điệp đến một đối tượng mà không biết liệu đối tượng có thể xử lý nó hay không - nếu có thể thì nó đã vượt qua bài kiểm tra gõ vịt một cách hiệu quả. Thông thường bạn nghĩ về đa hình như được thực hiện tại thời điểm biên dịch bằng cách thiết lập vtables (và nó có thể nếu giao diện khác với các lớp). Nhưng có rất nhiều ngôn ngữ ngoài kia và rất nhiều cách để thực hiện các tính năng này.

Ở một mức độ nào đó đây là một câu hỏi triết học. Bạn có thể nghĩ về việc gõ vịt như các giao diện được tự động tuyên bố ngầm? Chính xác, tôi không thể nghĩ ra bất kỳ lý do nào sai , nhưng tôi không nghĩ đó có lẽ là cách hiệu quả nhất để xem xét nó. Tôi nghĩ rằng gõ vịt và giao diện đều là những tính năng thường gặp của các hệ thống loại ngôn ngữ lập trình, cả hai đều có cách hành xử khá giống nhau và cả hai đều quan trọng để các lập trình viên hiểu.


6
"Đa hình đòi hỏi phải có nhân chứng", nơi mà nó nói như vậy? kế thừa dựa trên lớp chỉ là một dạng đa hình, không phải là dạng duy nhất.
Javier

Và tiếp tục bình luận của @ Javier, làm thế nào về đa hình ad hoc ?
yannis

@YannisRizos - Vấn đề khi trả lời bất kỳ câu hỏi nào như thế này là có rất nhiều ngôn ngữ và nhiều thuật ngữ đến nỗi ai đó có thể chọc bạn bất kể bạn nói gì. Tôi hiểu tại sao "đa hình ad hoc" có từ "đa hình" trong tên, nhưng tôi sẽ tranh luận đó là một cái gì đó khác với những gì OP có nghĩa là "đa hình".
psr

@Javier - Tất cả các phương pháp bạn liệt kê đều yêu cầu thám hiểm ngoại trừ gõ vịt.
psr

@psr Thật ra tôi không quan tâm đến ý nghĩa của OP trong "đa hình". Tôi không nghĩ ai nên quan tâm, đó là một khái niệm khoa học với định nghĩa rất đơn giản, tôi không nghĩ chúng ta nên trả lời dựa trên những diễn giải của chính mình hoặc những gì chúng ta có thể nghĩ đó là cách giải thích của OP. Đặc biệt là cách giải thích của OP, vì anh ta hỏi như vậy theo mặc định, anh ta không chắc chắn về cách giải thích của mình. Tôi không đồng ý rằng đó là một câu hỏi triết học, câu hỏi như đã nêu là một câu hỏi khoa học với một câu trả lời đơn giản: Có vịt là một dạng đa hình ad hoc, một tập hợp của đa hình.
yannis

1

Cảm giác gần như tự nhiên khi nói "Có, nếu foo có gõ vịt, foo có đa hình". Nhưng tôi không thể nói điều này chắc chắn 100%, trong một cảm giác rằng có lẽ nó có thể đưa ra một ví dụ nhân tạo của hệ thống như vậy mà có gõ vịt ( "nó có thể quack && nó có thể nổi trên mặt nước ==> nó là một Vịt ") trong khi không có đa hình (" foo, quack! "Không thành công), nhưng chúng thực sự sẽ là nhân tạo và trong thế giới thực, tôi sẽ nói" Có, nếu có hiện tượng gõ vịt, thì đa hình cũng phải có mặt ".

Cá nhân tôi thấy vịt gõ là "đa hình được thực hiện đúng". Ý tôi là, điều tồn tại trong một thế giới gõ vịt không cần phải có bất kỳ loại rõ ràng nào và hành vi (đa hình = "cùng truy cập, kết quả khác nhau") của chúng là điều duy nhất được tính. Trong các triển khai đa hình khác, nó bị ràng buộc theo kiểu / giao diện / kế thừa, do đó, nó là "đa hình được triển khai và bị ràng buộc" không phải là "đa hình trên mỗi se".


0

Các ngôn ngữ lập trình được nhập tĩnh cho phép kiểm tra lỗi sớm hơn, thực thi tốt hơn các kiểu lập trình có kỷ luật và tạo mã đối tượng hiệu quả hơn so với các ngôn ngữ nơi tất cả các kiểm tra tính nhất quán loại được thực hiện trong thời gian chạy.

(B. Xỏ và bạn bè)

Vì vậy, như bạn có thể lưu ý, về vấn đề này, gõ vịt là gõ động một cách thực sự chạy khác.

Có một số phương pháp để xác định loại liên quan đến đa hình, ví dụ như làm cho mã linh hoạt hơn nhưng gõ vịt là một vấn đề khác hoàn toàn trong những trường hợp này.

Trong các chi tiết có tính toán lambda đánh máy và tính toán lambda chưa được đánh dấu giúp xác định tính chất của tính toán và tính toán.

Tôi cũng thấy rằng những thứ như gõ vịt có thể giúp ích nếu chúng ta chỉ muốn đạt được kết quả nhanh chóng nhưng trong những dịp khác tôi cũng cảm thấy rằng bản chất năng động làm cho nó dễ điều chỉnh hơn theo nhu cầu, do đó tôi có thể tính toán nhanh hơn. Tôi đoán đó chỉ là để nói, thân yêu, rằng nếu tôi thực sự biết những gì tôi muốn tính toán, gõ là tốt nhất, nhưng tại sao tôi biết tôi muốn gì? Hehehe ...

Đó là năm xu của tôi và tôi đoán nó có thể tạo ra một chủ đề nghiên cứu thú vị.

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.