2010-05-01 26 views
6

Trong C#, là nó có thể có cùng các thông số chưa ghi đè lên nhau (họ là khác nhau trong các loại lợi nhuận)quá tải với cùng một chữ ký số

public override Stocks[] Search(string Field,string Param){ //some code} 
public override Stocks Search(string Field, string Param){//some code} 

C# trả về lỗi biên dịch

+0

Điều gì sẽ xảy ra nếu tôi không gán giá trị trả về, nhưng thay vì được gọi là 'Tìm kiếm (trường, tham số);'? –

+0

Tôi hiểu những gì bạn đang gợi ý, và tôi cũng đã nghĩ về nó, – Soham

Trả lời

0

Theo như tôi biết, nó là không thể.

Thậm chí nếu có, nó phức tạp không cần thiết. Chỉ cần trả về một mảng trong mọi trường hợp (nếu chỉ có một giá trị được trả về, thì đó là một mảng Cổ phiếu [1]). Điều đó sẽ giúp bạn tiết kiệm thời gian, đặc biệt là khi C# sử dụng mảng khá đơn giản.

11

Trong C#, bạn chỉ có thể quá tải các phương thức có chữ ký khác nhau.

Kiểu trả về của phương thức không được bao gồm trong chữ ký - chỉ tên, loại và số tham số của phương thức (và thứ tự của chúng). Hai ví dụ có cùng chữ ký, vì vậy chúng không thể tồn tại cùng nhau.

cổ điển, người ta có thể trả về một danh sách các mặt hàng (mảng hoặc cấu trúc dữ liệu khác) - nếu chỉ một mục là cần thiết, bạn chỉ cần trả về một danh sách với một mục.

+0

Tôi nghĩ, tôi sẽ đi với một danh sách – Soham

0

Không - trình biên dịch đưa ra lỗi vì nó chỉ sử dụng các tham số để loại bỏ phương thức cần gọi, không phải kiểu trả về.

+1

@Adam V - nó cũng sử dụng tên phương thức;) – Oded

+0

@Oded - figured it was not cần thiết để nói điều đó. :) –

+0

@Oded, :) Không phải là trình biên dịch sẽ chạy xung quanh tìm kiếm tất cả các phương thức có thể chấp nhận chuỗi tham số cụ thể bất kể tên ...Xin lỗi những suy nghĩ đã cười khúc khích vì vậy tôi đã phải chia sẻ. –

0

Không, bạn không thể.

CLR cho phép điều đó, nhưng vì một lý do nào đó, C# dudes quyết định không sử dụng tính năng CLR này.

+2

Thật khó để hỗ trợ bằng ngôn ngữ được cho là thành viên của gia đình C, mà các thành viên thường không có khái niệm đánh giá dựa vào ngữ cảnh. –

3

Như đã nêu đã nêu trong câu trả lời của mình, không thể quá tải phương thức khi khác biệt duy nhất là kiểu trả về.

public override Stocks[] Search(string Field,string Param){ //some code} 
public override Stocks Search(string Field, string Param){//some code} 

Hãy nghĩ về điều đó: Trình biên dịch biết biến thể phương thức nào cần gọi? Điều này dường như phụ thuộc vào kết quả tìm kiếm của bạn, và rõ ràng là trình biên dịch không thể biết trước.

Thực tế, điều bạn muốn là một chức năng có hai loại trả về có thể. Những gì bạn không muốn là hai phương pháp riêng biệt, bởi vì sau đó bạn phải quyết định lên phía trước cái nào cần gọi. Đây rõ ràng là cách tiếp cận sai ở đây.

Một giải pháp là luôn trả về mảng; trong trường hợp chỉ có một Stocks đối tượng được tìm thấy, bạn quay trở lại một loạt các kích thước 1.

1

Trong một cách bằng cách sử dụng nhiều giao diện:

struct Stock { public string Symbol; public decimal Price;} 
interface IByArray { Stock[] Search(string Field, string Param); } 
interface IByClass { Stocks Search(string Field, string Param); } 
class Stocks : IByArray, IByClass 
{ 
    Stock[] _stocks = { new Stock { Symbol = "MSFT", Price = 32.83m } }; 
    Stock[] IByArray.Search(string Field, string Param) 
    { 
     return _stocks; 
    } 
    Stocks IByClass.Search(string Field, string Param) 
    { 
     return this; 
    } 
} 
Các vấn đề liên quan