Tại sao các ngôn ngữ lập trình tạo chữ ký phương thức mà không liên quan đến kiểu trả về?


11

Tôi đã làm việc với nhiều ngôn ngữ không tạo chữ ký phương thức dựa trên loại trả về. Tôi cũng đã làm việc với một (có thể một số?) Mà làm. Những người không cho tôi vấn đề trong quá khứ (như ở đây ). Tại sao các ngôn ngữ lập trình tạo chữ ký phương thức mà không liên quan đến kiểu trả về?

Cập nhật: Tôi đang đề cập cụ thể đến các ngôn ngữ được nhập tĩnh


Đây là một phỏng đoán rất vô căn cứ, nhưng tôi đoán nó có liên quan đến khó khăn trong việc thực hiện trình biên dịch và / hoặc hỗ trợ công cụ.
Charles Lambert

Trong Haskell, bạn có thể sử dụng các kiểu chữ để cơ bản tạo các hàm phụ thuộc kiểu trả về. Tôi <3 Haskell: D: D: D
Thomas Eding

Câu trả lời:


5

Nó sẽ không phù hợp với hệ thống phân cấp kiểu chữ và kiểu chữ. Nếu bạn có hai phiên bản của một phương thức, một trong số đó trả về loại A và một phiên bản trả về loại B, bạn sẽ gặp rắc rối khi:

  • A hoặc B là các kiểu con của nhau và bạn gán giá trị trả về cho kiểu con là siêu kiểu.
  • A và B có một siêu kiểu chung và bạn gán cho một giá trị siêu kiểu như vậy.

Bạn có thể giải quyết vấn đề này bằng các diễn viên, nhưng điều đó sẽ đòi hỏi phải gõ nhiều như đổi tên một trong các chức năng. Bạn cũng có thể đăng ký lỗi trình biên dịch khi cuộc gọi không rõ ràng, trong trường hợp đó, người dùng cần bỏ ra số lượng nỗ lực tương tự.


1
Tôi đã làm việc với các ngôn ngữ bao gồm loại trả lại trong chữ ký. Đúc khắp nơi không phải là một vấn đề như bạn chỉ ra. Trong ví dụ cụ thể của bạn, bạn sẽ không cần phải khắc phục điều này bằng các diễn viên. Nếu cả A và B (các kiểu con của C) đều có cùng một hoạt động, thì nó phải được khai báo bằng C. Nếu kiểu trả về khác với A so với B: Trong hầu hết các trường hợp, nó đang cố gắng trả về một kiểu con của C. Bạn chỉ đơn giản là thêm một phương thức khác trong kiểu con trả về kiểu con và thực hiện phiên bản từ C để gọi phương thức đó với kiểu con cụ thể. Bây giờ bạn không phải bỏ đi khắp nơi.
Charles Lambert

@Charles Lambert: Đây không phải là một hoạt động trên các lớp A, B hoặc C. Đây là hai hàm có cùng tên và danh sách tham số, một trong số đó trả về một cái gì đó thuộc loại A và một trong số đó trả về một loại loại B. Câu hỏi này áp dụng không chỉ là các hệ thống OOP, vì vậy tôi đã trả lời dựa trên các loại và chức năng chung. Ngoài ra, tôi không hiểu ví dụ phản bác của bạn dự định thực hiện là gì; chi tiết hơn là cần thiết để tôi trả lời nó.
jprete

Một bình luận quá ngắn cho một ví dụ. pastebin.com/JR39PKs0 về cơ bản các ngôn ngữ bao gồm loại trả về trong chữ ký đã đưa ra các cách để giảm bớt vấn đề bạn đang mô tả. Có thể là quy ước mã hóa, hoặc chỉ là thực hành tiêu chuẩn. Cũng cần lưu ý, không có nhiều nội dung bạn viết sẽ đảm bảo tạo ra các phương thức chỉ khác nhau về kiểu trả về. Vì vậy, một lần nữa, bạn sẽ không phải đối phó với điều này rất thường xuyên
Charles Lambert

Sẽ có bất kỳ khó khăn nào khi có một quy tắc chỉ có thể khai báo một phương thức "chính" cho bất kỳ chữ ký đối số đã cho nào, nhưng một số phương thức phụ tùy ý có thể được khai báo và trình biên dịch sẽ thực hiện nạp chồng bằng cách xác định trước một chữ ký đối số mà phương thức chính tồn tại, và sau đó kiểm tra các phương thức thứ cấp theo một số thứ tự được chỉ định để xem liệu phương thức nào đó có phù hợp rõ ràng hơn không (hoặc có thể sử dụng được ngay cả khi phương thức chính không)?
supercat

3

Bởi vì bạn có thể gọi một phương thức và không gán kết quả của nó.


3
Không phải trong mọi ngôn ngữ.
Jörg W Mittag

@Jorg Thích ngôn ngữ nào?
Chiron

1
f # là một ngôn ngữ. Bạn thường thấy foo -> bỏ qua nơi bỏ qua là một phương thức với loại đơn vị trả về tương tự như void
Charles Lambert

Ada là một ví dụ tốt hơn. Ngôn ngữ đó thực sự sử dụng các kiểu trả về là một phần của chữ ký.
Charles Lambert

-4

Quy tắc ngón tay cái: các ngôn ngữ được gõ mạnh thường liên kết chữ ký phương thức với kiểu trả về. Ngôn ngữ đánh máy yếu không.
Tôi không biết C #, nhưng tôi cho rằng vấn đề có thể là do cách C # xử lý thuốc generic. Nó có thể tạo ra một phương thức hoàn toàn khác cho phương pháp chung, trong trường hợp đó chúng thực sự là hai phương thức khác nhau.


1
Tôi tò mò không biết những ngôn ngữ được đánh máy mạnh mẽ nào? Tôi không biết về bất kỳ điều gì và tôi biết rõ ràng C ++ cấm độ phân giải đối với kiểu trả về.
greyfade

2
-1 Nếu bạn định đưa ra một quy tắc ngón tay cái có vẻ sai trái với một ví dụ duy nhất vi phạm nó, bạn nên tuân theo quy tắc đó với tất cả các ví dụ khác nơi quy tắc được tuân thủ.

@greyfade, quan điểm của tôi là trong các ngôn ngữ được gõ yếu, bài tập không được kiểm tra tại thời điểm biên dịch. Đồng ý, điều đó có thể không thích hợp ở đây.
CMR

Quan điểm của bạn bị che khuất bởi khẳng định không chính xác của bạn rằng "các ngôn ngữ được gõ mạnh thường liên kết ... với loại trả về".
greyfade
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.