2009-07-23 22 views
14

Bạn có thực sự cần từ khóa này để các phương pháp quá tải không? Sự khác biệt giữa việc sử dụng từ khóa quá tải so với chỉ có chữ ký phương thức khác nhau là gì?Từ khóa "Quá tải" trong VB.NET

Trả lời

15

Trong cùng một lớp, từ khóa Overloads là tùy chọn, nhưng nếu một phương thức được khai báo Overloads hoặc Overrides, bạn phải sử dụng nó cho tất cả các tình trạng quá tải của phương pháp đó.

' this is okay 
Sub F1(s as String) 
Sub F1(n as Integer) 

' This is also okay 
Overloads Sub F2(s as String) 
Overloads Sub F2(n as Integer) 

' Error 
Overloads Sub F3(s as String) 
Sub F3(n as Integer) 

Tuy nhiên, điều này trở nên phức tạp hơn khi bạn đang quá tải lớp cơ sở trong lớp dẫn xuất.

Nếu lớp cơ sở có nhiều phương thức quá tải và bạn muốn thêm phương thức quá tải trong lớp dẫn xuất, thì bạn phải đánh dấu phương thức trong lớp dẫn xuất với từ khóa Overloads, nếu không tất cả các phương thức quá tải trong lớp cơ sở là không có trong lớp dẫn xuất.

Xem MSDN để biết thêm chi tiết.

+1

Ah, một trong những từ khóa VB.NET vô dụng như "ReadOnly" cho thuộc tính, "Tùy chọn" cho tham số tùy chọn hoặc "ByVal": D –

+0

@RayKoopa Yup! (nhưng "Tùy chọn" không phải là Tùy chọn: D) – unnknown

+0

Vâng, thật đáng buồn. Trong khi đó, tôi đã nói chuyện với một nhà thiết kế ngôn ngữ VB trên VS Uservoice, và lý do để giữ những yêu cầu này là vì ngôn ngữ nên hỗ trợ IDE trong việc tự động tạo ra các tài sản hoặc những thứ khác (ví dụ: chỉ có một Get stub nếu bạn viết "ReadOnly"). Trong thực tế, VB được thiết kế để hỗ trợ IDE, nó không phải là IDE được thiết kế để hỗ trợ VB. Kỳ dị! –

9

Đó là một thiết kế cân nhắc. Tất nhiên nó (VB) có thể được thiết kế để suy ra quá tải bằng chữ ký hàm (như trong C#) - vì vậy chính từ khóa Overloads có thể đã bị bỏ qua nhưng cuối cùng nó chỉ phù hợp với tính biểu cảm của Visual Basic. và đó chỉ là một quyết định thiết kế ngôn ngữ.

+0

OP hỏi về lý do quá tải (so với các tên khác nhau cho các phương thức), không phải lý do tại sao sử dụng từ khóa quá tải. –

+4

@Adrian Godong: OP hỏi xem liệu có cần từ khóa "Overloads" trong VB - không phải là liệu quá tải có hữu ích hay không (trái ngược với chỉ sử dụng các tên phương thức khác nhau) –

+0

@Adrian: Đó là sai - Anh ta hỏi về từ khóa – Dario

0

Overloads -Từ khóa là tùy chọn hoàn toàn - Tôi không thấy lợi thế khi sử dụng.

+0

OP hỏi về lý do tại sao quá tải (so với các tên khác nhau cho các phương thức), không phải lý do tại sao sử dụng từ khóa quá tải. –

+0

Đó là sai - Anh ta hỏi về từ khóa: Anh ta không nói về tên nhưng chữ ký, chúng tôi gọi là quá tải – Dario

3

Miky D là đúng. Không có sự khác biệt giữa một phương thức quá tải đã khai báo Overloads và một phương thức khác không có.

Tôi chỉ muốn chỉ ra rằng từ khóa Quá tải là bắt buộc khi một phương thức khác có cùng tên được khai báo Ghi đè hoặc quá tải. Ví dụ, nếu bạn ghi đè lên các phương pháp Equals như thế này:

Public Overrides Function Equals(ByVal obj As Object) As Boolean ... 

Sau đó, bạn muốn tạo ra một tình trạng quá tải như thế này:

Public Function Equals(ByVal otherProduct As Product) As Boolean ... 

Bạn sẽ nhận được lỗi sau:

"function 'Equals' must be declared 'Overloads' because another 'Equals' 
is declared 'Overloads' or 'Overrides'." 

Bạn sẽ gặp lỗi tương tự nếu ai đó khai báo một phương thức là Overloads và bạn muốn quá tải phương thức đó. Bạn sẽ phải thêm từ khóa Overload vào phương thức của bạn hoặc loại bỏ nó từ phương thức khác.

Cá nhân tôi không bao giờ khai báo phương thức quá tải Quá tải trừ khi tôi không có lựa chọn, như trong tình huống trên.

2

Tôi gặp phải tình huống mà tôi được yêu cầu sử dụng từ khóa Quá tải.

Tôi có một lớp cha và một lớp được kế thừa.

Public Class DataManager 

    Public MustOverride Function LoadDataSet(ByVal TableName as String, ByVal SQL as SQLObject) as DataSet 

    Public Function LoadDataSet(ByVal TableName as String, ByVal SQL as String) as DataSet 
    Return LoadDataSet(TableName, new SQLObject(SQL)) 
    End Function 
End Class 

Public Class OracleDataManager 
    Inherits DataManager 

    Public Overloads Overrides Function LoadDataSet(ByVal TableName as String, ByVal SQLObj as SQLObject) as DataSet 
    // code here 
    End Function 

End Class 

Trong ví dụ này, tôi phải sử dụng từ khóa quá tải.

15

Điều này hiển thị cao trong kết quả của Google và tôi nghĩ điều đó có thể được giải thích rõ ràng hơn tại đây.

Không có lý do gì để sử dụng từ khóa Overloads khi bạn đang quá tải các phương thức khác nhau trong cùng một lớp. Lý do chính mà bạn sẽ sử dụng Overloads là cho phép một lớp dẫn xuất gọi một phương thức từ lớp cơ sở của nó có cùng tên với phương thức quá tải, nhưng một chữ ký khác.

Giả sử bạn có hai lớp, FooSonOfFoo, trong đó SonOfFoo được kế thừa từ Foo. Nếu Foo triển khai phương thức có tên là DoSomethingSonOfFoo thực hiện phương thức có cùng tên, phương thức SonOfFoo sẽ ẩn triển khai của lớp cha ... ngay cả khi hai phương pháp có các tham số khác nhau. Chỉ định từ khóa Overloads sẽ cho phép lớp dẫn xuất gọi quá tải của lớp cha của phương thức.

Dưới đây là một số mã để chứng minh ở trên, với các lớp FooSonOfFoo thực hiện như mô tả, và một cặp của các lớp học, BarSonOfBar rằng sử dụng Overloads keyword:

Class Foo 
    Public Sub DoSomething(ByVal text As String) 
     Console.WriteLine("Foo did: " + text) 
    End Sub 
End Class 

Class SonOfFoo 
    Inherits Foo 

    Public Sub DoSomething(ByVal number As Integer) 
     Console.WriteLine("SonOfFoo did: " + number.ToString()) 
    End Sub 
End Class 

Class Bar 
    Public Sub DoSomething(ByVal text As String) 
     Console.WriteLine("Bar did: " + text) 
    End Sub 
End Class 

Class SonOfBar 
    Inherits Bar 

    Public Overloads Sub DoSomething(ByVal number As Integer) 
     Console.WriteLine("SonOfBar did: " + number.ToString()) 
    End Sub 
End Class 

Sub Main() 
    Dim fooInstance As Foo = New SonOfFoo() 
    'works 
    fooInstance.DoSomething("I'm really a SonOfFoo") 
    'compiler error, Foo.DoSomething has no overload for an integer 
    fooInstance.DoSomething(123) 

    Dim barInstance As Bar = New SonOfBar() 
    'works 
    barInstance.DoSomething("I'm really a SonOfBar") 
    'compiler error, Bar.DoSomething has no overload for an integer 
    barInstance.DoSomething(123) 

    Dim sonOfFooInstance As New SonOfFoo() 
    'compiler error, the base implementation of DoSomething is hidden and cannot be called 
    sonOfFooInstance.DoSomething("I'm really a SonOfFoo") 
    'works 
    sonOfFooInstance.DoSomething(123) 

    Dim sonOfBarInstance As New SonOfBar() 
    'works -- because we used the Overloads keyword 
    sonOfBarInstance.DoSomething("I'm really a SonOfBar") 
    'works 
    sonOfBarInstance.DoSomething(123) 
End Sub 

Dưới đây là some information về cách này biên dịch khác nhau trong CLI.

+0

Vì vậy, mặc định là 'Shadows'. –

+19

Tôi phải là người lãng quên nhất trên thế giới; Tôi đến đây từ một tìm kiếm của Google và cuối cùng đã tự đập mình vào mặt khi tôi nhìn thấy câu trả lời của chính mình. –

+0

Còn các chức năng thì sao? Bạn có thể thêm một cái gì đó? – beppe9000