2010-07-27 47 views

Trả lời

19

IMO, lợi ích chính là nhất quán trong việc đặt tên các phương thức/chức năng thực hiện nhiệm vụ rất giống nhau một cách hợp lý và hơi khác nhau bằng cách chấp nhận các thông số khác nhau. Điều này cho phép cùng một tên phương thức được sử dụng lại trên nhiều lần triển khai.

ví dụ: Quá tải: (Tốt)

function Person[] FindPersons(string nameOfPerson) { ... } 
function Person[] FindPersons(date dateOfBirth) { ... } 
function Person[] FindPersons(int age, string dogsName) { ... } 

Are thích hợp hơn để chức năng 'tên duy nhất': (Tệ hơn)

function Person[] FindPersonsByName(string nameOfPerson) { ... } 
function Person[] FindPersonsByDOB(date dateOfBirth) { ... } 
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... } 

Bằng cách này các coder viết một khách hàng mà gọi/tiêu thụ các chức năng này có thể hoạt động tại một cao hơn mức độ tư duy khái niệm ("Tôi cần phải tìm một người") và không cần phải nhớ/xác định vị trí một tên chức năng contrived.

Với kiểu nhập tĩnh, trình biên dịch sẽ được để lại để phù hợp với tình trạng quá tải áp dụng dựa trên các thông số sử dụng. Để nhập động, kết quả trùng khớp này sẽ xảy ra vào thời gian chạy, có thể dẫn đến lỗi nếu không tìm thấy kết quả phù hợp.

+2

Tôi đồng ý, nhưng bạn cần phải cẩn thận nếu vì một lý do nào đó bây giờ bạn muốn tạo FindPerson (String city) vì vậy tôi không chắc đó là ví dụ tốt nhất ... Các đối số vẫn hợp lệ mặc dù – h4lc0n

+0

Giải thích thực sự tốt. Cảm ơn bạn đã cải thiện kiến ​​thức của tôi sir :) bạn cũng có thể giải thích cho tôi về "cách sử dụng phương pháp ghi đè theo cùng một cách? \" – iPatel

+1

@iPatel - ghi đè là sự kích thích của [đa hình phụ] (http://en.wikipedia.org/ wiki/Đa hình_ (computer_science) #Subtyping), như được thực hiện trong các phương thức lớp ảo (thường là trừu tượng) hoặc các giao diện - có xem ví dụ trong liên kết Wikipedia. Ngoài ra [xem tại đây] (http://en.wikipedia.org/wiki/Method_overriding). Ngoài ra, 'overloading' đôi khi được gọi là' đa hình adhoc '. – StuartLC

3

Một chức năng/phương pháp đôi khi có thể lấy các loại thông số khác nhau để thực hiện công việc. Đây là thời gian cho quá tải hàm. Nếu không, bạn sẽ phải có các chức năng khác nhau cho chức năng tương tự , đó là thực tế khó hiểu và không tốt.

  • Các hàm tạo là các hàm, do đó chúng có thể bị quá tải. Điều này rất tiện dụng.
  • Khi bạn lần đầu tiên vào tình trạng quá tải, thật dễ dàng để trở nên quá ưa thích, nghĩ rằng bạn đang làm cho các nhà phát triển trong tương lai có lợi bằng cách cung cấp cho họ các tùy chọn thuận tiện hơn. Cố gắng tránh điều này. Quá tải không cần thiết có thể khiến nhầm lẫn nhà phát triển trong tương lai và gây ra mã không cần thiết để duy trì.
1

Nó cung cấp nhiều hành vi cho cùng một đối tượng liên quan đến các thuộc tính của đối tượng.

Ví dụ: phương pháp được gọi là addUs(a,b) thêm ab.

Vì vậy, định nghĩa sẽ là:

int addUs(int a, int b){ 
    return a+b; 
} 

Nhưng bây giờ nếu bạn muốn lập luận của bạn sẽ được đối tượng của một lớp nói:

class Demo{ 
    int height; 
    int width; 
} 

Bạn muốn cùng chức năng addUs() để trả về một đối tượng mới sẽ có các thuộc tính chiều cao và chiều rộng có các giá trị là tổng của chiều cao & chiều rộng của 2 đối số được chuyển.

Vì vậy bây giờ định nghĩa sẽ là:

Demo addUs(Demo a Demo b){ 
    Demo this; 
    this.height = a.height + b.height; 
    this.width = a.width + b.width; 
    return this; 
} 
+0

Ngôn ngữ lập trình nào? Đã làm của bạn, và = chính phá vỡ? ;) – masterxilo

1

Đôi khi bạn có nhiều cách để hoàn thành điều tương tự dựa trên bối cảnh và nguyên liệu đầu vào có sẵn. Đối với các ngôn ngữ tĩnh loại nghiêm ngặt, các định nghĩa chức năng có thể khá cứng nhắc và cần phải được xác định rõ ràng trước thời hạn.

Các nhà xây dựng nói chung là ví dụ điển hình tốt nhất về điều này. Nếu bạn đang xây dựng một đối tượng phức tạp và không có tất cả các phần, bạn vẫn muốn có thể truyền những gì bạn có cho một hàm tạo và để nó lấp đầy phần còn lại. Và những gì bạn có thể thay đổi một cách dữ dội và cần được định nghĩa theo các cách khác nhau như các tham số cho các nhà xây dựng.

6

Câu hỏi rất hợp lệ.

Bạn nhận được sự nhất quán trong đặt tên, nhưng với chi phí sự mơ hồ về việc triển khai chính xác.

  • Vấn đề thực sự là bộ nhớ con người cho tên phương pháp , phải không? chúng tôi tìm thấy nó dễ nhớ hơn các tên là thường được sử dụng.

  • và nền kinh tế đang nhập, cho phép tên phương thức ngắn hơn? ít hơn tên khác nhau có nghĩa là (toán học) rằng chính tên mang ít thông tin hơn.

Hai vấn đề này không phải là mối quan tâm, với IDE tìm/đoán/chèn tên phương thức nhanh chóng dựa trên một vài ký tự đầu tiên và kiểu tham số/trả về.

Nhưng tôi nghĩ rằng có một chi phí, tính chính xác của mã hóa, cũng như một lợi ích.

3
  1. Nhiều hành vi có cùng chức năng dựa trên các thông số.
  2. Chức năng của bạn có thể muốn hoạt động với một số chi tiết tùy chọn. Ví dụ: ví dụ sau muốn thêm thành viên vào đối tượng Thành viên, với bất kỳ chi tiết nào người dùng biết. Ở đây tuổi là chi tiết tối thiểu để tạo thành viên, tuổi và memberOf là tùy chọn. [Lưu ý: định nghĩa các hàm không được cung cấp trong đoạn mã.]

    public class Members 
    { 
        public System.Collections.Generic.List<Member> TeamMembers; 
    
        public AddMember(Member m) {} 
        public AddMember(string name) {} 
        public AddMember(string name, int age) {} 
        public AddMember(string name, int age, string[] memberOf) {} 
    
        public class Member 
        { 
         public string Name { get; set; } 
         public int Age { get; set; } 
         public string[] MemberOf { get; set; } 
        } 
    } 
    
  3. Bạn có thể muốn phương pháp của mình phù hợp với nhiều loại đối tượng. ví dụ: Phương thức Console.WriteLine() có khả năng viết dòng trống, bool, int, string, char [], float… trên bàn điều khiển. Điều này đã được thực hiện có thể do quá tải hàm.

+0

Đối số mặc định không phù hợp hơn cho ví dụ này? Tôi không thấy điều này như là sử dụng tốt chức năng quá tải, đặc biệt là khi bạn phải hoặc mã trùng lặp hoặc gọi các phương thức đơn giản hơn (với ít đối số) bên trong các hàm phức tạp hơn. – Davorin

+0

Tham số mặc định có thể cung cấp câu trả lời để bổ sung thêm thông số. Nhưng bản chất ở đây là quá tải phương thức cho phép bạn thực thi một khối mã hoàn toàn khác (phương thức) dựa trên kiểu tham số và số tham số được chèn vào. Trong hai biến thể đầu tiên của AddMember, bạn có thể thêm một đối tượng Member làm đối số hoặc một chuỗi; việc thực hiện chúng có thể đi theo tuyến đường khác. Hãy so sánh chức năng này với phương thức Console.Write() chẳng hạn. – SaravananArumugam

0

Bạn có thể muốn làm những việc tương tự trong mã với các thông số khác nhau. Nếu bạn phải cung cấp cho mọi chức năng một tên khác nhau, khả năng đọc mã sẽ rất tệ.

5

Quá tải là một dạng đa hình. Nó cho phép lập trình viên viết các hàm để làm khái niệm cùng một điều trên các kiểu dữ liệu khác nhau mà không thay đổi tên. (Nó cũng cho phép lập trình viên viết các hàm để thực hiện các khái niệm khác nhau tùy thuộc vào các tham số, nhưng đó là một ý tưởng thực sự.)

Điều này cho phép tính nhất quán trong ký hiệu, tốt cho cả đọc và viết mã. I/O là một cách sử dụng rất phổ biến. Trong hầu hết các ngôn ngữ sử dụng phổ biến, có một hàm hoặc toán tử sẽ xuất ra bất cứ thứ gì bạn thích, chẳng hạn như printf() và thân nhân trong C, operator<<() trong C++, PRINT trong BASICS cũ mà tôi từng sử dụng, bất cứ điều gì.Các ngôn ngữ yêu cầu các chức năng như printint(), printstring(), printfloat() và các tính năng tương tự chưa bao giờ bắt được.

Nó hoạt động rất tốt với các mẫu C++ và bất kỳ cấu trúc nào khác mà bạn không nhất thiết phải biết loại biến là gì tại thời điểm viết mã.

0

Đây là cơ chế của hàm có cùng tên nhưng thực hiện tác vụ khác nhau trên cá thể khác nhau. Chúng ta dễ dàng nhớ những cái tên thường được sử dụng.

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