2010-05-11 39 views
15

Trong quá tải phương thức, có thể có các kiểu trả về khác nhau cho một phương thức quá tải không? Ví dụ: ,Có thể có các kiểu trả về khác nhau cho một phương thức quá tải không?

void foo(int x) ; 
int foo(int x,int y); 
double foo(String str); 

trong lập trình hướng đối tượng chung, có thể không?

+1

Ngắt của http://stackoverflow.com/questions/584664/why-cant-two-methods-be-declared-with-the-same-signature-even-though-ret- đó là bản thân f http://stackoverflow.com/questions/442026/function-overloading-by-return-type – paxdiablo

Trả lời

0

Đối với hầu hết các ngôn ngữ lập trình hỗ trợ quá tải phương thức (Java, C#, C++, ...), nếu các kiểu tham số khác nhau, thì kiểu trả về cũng có thể khác nhau.

1

Chừng nào bạn không làm một cái gì đó như thế này:

int foo (int i, int has_default=0); 
double foo (long l); 
/* Skipping to the function call. */ 
foo (1); 

bạn sẽ không sao. Đoạn mã trên sẽ gây ra vấn đề bởi vì nó có thể đang cố gắng gọi một trong hai hàm. Nó có thể được thực sự tồi tệ nếu bạn đang sử dụng C++, và bạn quay lại con trỏ thay vì nguyên thủy hoặc tài liệu tham khảo ...

0

Kiểm tra câu trả lời tuyệt vời này, Function overloading by return type?

Nói tóm lại, ngôn ngữ tĩnh nhất gõ không, nhưng một số ngôn ngữ được nhập động có thể.

Chỉnh sửa: Câu trả lời "Trong ngắn" áp dụng cho quá tải đúng theo loại trả về. Như những người khác đã chỉ ra, nếu tham số liệt kê khác nhau, và có thể được giải quyết bởi trình biên dịch, thì mỗi phương thức có thể trả về một kiểu khác. Nó có thể quá tải các phương thức chỉ bằng kiểu trả về trong ADA, vì giá trị trả về không thể bỏ qua, và trình biên dịch có thể giải quyết cuộc gọi phương thức bằng cách sử dụng thông tin này.

+0

Đã chỉnh sửa sau khi không giải thích được. –

19

Trong một lớp học, có thể có một số phương pháp chia sẻ cùng tên nhưng khác nhau về

  1. loại Parameter
  2. Số thông số
  3. Trình tự các thông số khai báo trong phương pháp

Bằng cách tùy thuộc vào các tham số được cung cấp cho phương thức, trong thời gian chạy, trình biên dịch xác định phiên bản của phương thức cần thực hiện.

Phương thức quá tải có thể hoặc không thể có các loại trả lại khác nhau. Nhưng kiểu trả về một mình là không đủ cho trình biên dịch để xác định phương thức nào sẽ được thực thi tại thời gian chạy.

+3

"trong thời gian chạy, trình biên dịch xác định" AFAIK trong thời gian chạy, trong khi chương trình đang chạy trình biên dịch không thể xác định bất cứ điều gì. và Phương pháp quá tải là một ví dụ về ** Tính đa hình thời gian biên dịch **. –

+0

@Dunith Dhanushka tại sao bạn lại nói Order of Parameters? 'Khoảng trống vui nhộn (int a, char a) { \t \t \t \t \t} \t \t trống vui nhộn (char a, int a) { \t \t} 'nó không làm việc – UnKnown

+0

Trên thực tế, trật tự của các tham số không rõ trong C++ , vì vậy -1. –

1

Không có phương pháp quá tải là không thể trong trường hợp của kiểu trả về khác nhau, bởi vì trình biên dịch không thể tìm thấy phương pháp nào ông cần phải gọi ..

+0

điều này hoàn toàn đúng ..! :) –

0

có ví dụ đưa ra bởi bạn là có thể xảy ra, chúng tôi có thể làm phương pháp ovrloading trong theo cách này trong C#

void foo(int x) 
    { 
    } 
    int foo(int x, int y) 
    { 
     return 0; 
    } 
    double foo(String str) 
    { 
     return 1; 
    } 
+0

bạn đã thử cái này chưa? làm thế nào bạn sẽ gọi các chức năng này bạn có thể giải thích với ví dụ cho ở trên? –

12

Không thể có phương pháp có cùng thông số và loại khác nhau return. Trình biên dịch throws error trong trường hợp dưới đây (Phương pháp trùng lặp).

Phương pháp 1:

public int calc(int a, int b, int c) 

Cách 2:

public String calc(int e, int f, int g) 
0
Integer doSomething(){return null;} 
String doSomething(){return null;} 

main(){ 
    doSomething() 
} 

Trong trường hợp trình biên dịch này sẽ không bao giờ biết được phương pháp được gọi.

Lưu ý - Phương pháp quá tải sẽ được kiểm tra trong thời gian biên dịch

9

Phương pháp quá tải có nghĩa là có hai hay nhiều phương pháp với cùng một tên trong lớp cùng với các đối số khác nhau. Lợi ích của quá tải phương thức là nó cho phép bạn thực hiện các phương thức hỗ trợ cùng một hoạt động ngữ nghĩa nhưng khác nhau theo số hoặc kiểu đối số.

điểm quan trọng

  • quá tải phương pháp PHẢI thay đổi danh sách đối số
  • phương pháp quá tải có thể thay đổi kiểu trả
  • phương pháp quá tải có thể thay đổi sửa đổi lần truy cập
  • phương pháp quá tải THỂ tuyên bố mới hoặc rộng hơn kiểm tra trường hợp ngoại lệ
  • Phương thức có thể bị quá tải trong cùng một lớp hoặc trong một phân lớp
+0

Có "Phương pháp quá tải CÓ THỂ thay đổi kiểu trả về" và "• Phương pháp quá tải CÓ THỂ thay đổi điều chỉnh truy cập" các tình huống hoạt động không? Theo kinh nghiệm thực tế của tôi nó WONT WORK. Ví dụ: lớp công khai myclass { công khai int c = 0; chuỗi công cộng Thêm (int a, int b) { c = a + b; return c.ToString(); } int công cộng Thêm (int a, int b) { c = a + b; trả lại c; } } –

+1

@SHEKHARSHETE Nhưng danh sách đối số không thay đổi trong ví dụ của bạn, Phải thay đổi danh sách đối số khác là ví dụ –

2

Điều này không hợp lệ cho quá tải. Bạn chỉ có thể quá tải bằng cách thay đổi danh sách tham số. Việc thay đổi kiểu trả về một mình không hợp lệ đối với việc nạp chồng phương thức vì kiểu trả về không phải là một phần của chữ ký phương thức (chỉ tên phương thức và danh sách tham số nằm trong chữ ký phương thức).

0

Bạn có thể sử dụng mẫu tính năng Varadic của C++ Nghe là Ví dụ:

template<typename T> 
T adder(T v) { 
    return v; 
} 

template<typename T, typename... Args> 
T adder(T first, Args... args) { 
    return first + adder(args...); 
} 

Và đây là một vài cách chúng ta có thể gọi nó là:

long sum = adder(1, 2, 3, 8, 7); 

std::string s1 = "x", s2 = "aa", s3 = "bb", s4 = "yy"; 
std::string ssum = adder(s1, s2, s3, s4); 

Đối với refrence hơn https://eli.thegreenplace.net/2014/variadic-templates-in-c/

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