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
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.
Đó 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ữ.
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. –
@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) –
@Adrian: Đó là sai - Anh ta hỏi về từ khóa – Dario
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.
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. –
Đó 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
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.
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.
Đ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, Foo
và SonOfFoo
, trong đó SonOfFoo
được kế thừa từ Foo
. Nếu Foo
triển khai phương thức có tên là DoSomething
và SonOfFoo
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 Foo
và SonOfFoo
thực hiện như mô tả, và một cặp của các lớp học, Bar
và SonOfBar
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.
Vì vậy, mặc định là 'Shadows'. –
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. –
Còn các chức năng thì sao? Bạn có thể thêm một cái gì đó? – beppe9000
- 1. Quá tải so với ghi đè trong VB.net
- 2. Tại sao các toán tử gán quá tải trong VB.NET?
- 3. Quá tải, suy luận kiểu chung và từ khóa 'params'
- 4. Quá tải trong Ruby
- 5. Tương đương VB.NET của từ khóa C# "là" là gì?
- 6. Có thể thêm từ khóa vào C# hoặc VB.NET không?
- 7. VB.NET tương đương với từ khóa C# var
- 8. Chức năng quá tải và tham số mặc định trong VB.NET?
- 9. Một số quá tải cho phương pháp với "params" từ khóa
- 10. Quá tải trong Ocaml
- 11. Lỗi trình tải khóa với VB.NET 2008 (chỉ dành cho Windows XP?)
- 12. tải RSA khóa công khai từ file
- 13. Có một tuyên bố khóa trong VB.NET không?
- 14. Quá tải int() trong Python
- 15. Quá tải hàm trong CodeIgniter
- 16. Trang trí cho quá tải trong Python
- 17. Quá tải python in
- 18. Làm thế nào để ngăn chặn một phương pháp từ quá tải trong Java?
- 19. Cách tải khóa RSA từ tệp PEM và sử dụng khóa đó trong python-crypto
- 20. toán tử [] = quá tải?
- 21. Quá tải ngã ba()
- 22. Quá tải sau khi tăng quá mức
- 23. quá tải mới/xóa
- 24. Làm rõ quá tải
- 25. Quá trình toán tử C++ quá tải
- 26. Quá tải static_cast?
- 27. VB.NET tương đương với từ khóa chỉ đọc C# là gì?
- 28. Quá tải hàm rvalue
- 29. quá tải dereference hành
- 30. Quá tải toán tử
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 –
@RayKoopa Yup! (nhưng "Tùy chọn" không phải là Tùy chọn: D) – unnknown
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ị! –