メソッドをオーバーロードするには本当にこのキーワードが必要ですか?オーバーロードキーワードの使用と異なるメソッドシグニチャの違いとは何ですか?VB.NETで "Overloads"キーワード
答えて
同じクラス内で、Overloads
キーワードはオプションですが、一つの方法がOverloads
またはOverrides
を宣言されている場合、あなたはその方法のすべてのオーバーロードのためにそれを使用する必要があります。
' 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)
ただし、派生クラスで基本クラスのメソッドをオーバーロードすると、より複雑になります。
基本クラスに複数のオーバーロードされたメソッドがあり、オーバーロードされたメソッドを派生クラスに追加する場合は、派生クラスのメソッドをOverloads
キーワードでマークする必要があります。そうでない場合、ベースクラスのオーバーロードされたメソッドはすべて派生クラスでは使用できません。
詳細はMSDNを参照してください。
これは設計上の考慮事項でした。もちろん、それは関数シグネチャ(C#のような)によってオーバーロードを推測するように設計されている可能性があります。そのため、Overloadsキーワード自体は省略できましたが、最終的にVisual Basicの表現力(オーバーヘッドを考慮する)それは言語設計の決定に過ぎませんでした。
OPはなぜオーバーロードするのかを質問しています(メソッドに異なる名前をつけているのに対して)。 –
@Adrian Godong:OPは、オーバーロードが便利であるかどうか(異なるメソッド名を使用するのではなく) –
@Adrian:それは間違っている - 彼はキーワード – Dario
Overloads
- キーワードは完全にオプションです。使用上の利点はありません。
OPはなぜオーバーロードするのか(なぜなら、メソッドの名前が違う)、なぜoverloadキーワードを使用しないのかを尋ねています。 –
それは間違っています - 彼はキーワードについて尋ねます:彼は名前については話しませんが署名は、我々はそのオーバーロードと呼んでいます – Dario
Miky Dが正しい。 Overloads宣言されたオーバーロードされたメソッドとそうでないオーバーロードされたメソッドの間に違いはありません。
同じ名前の別のメソッドがオーバーライドまたはオーバーロードと宣言されている場合、Overloadsキーワードは必須であることを指摘しておきます。たとえば、あなたはこのようにEqualsメソッドをオーバーライドした場合:
"function 'Equals' must be declared 'Overloads' because another 'Equals'
is declared 'Overloads' or 'Overrides'."
:
Public Function Equals(ByVal otherProduct As Product) As Boolean ...
あなたは次のエラーが発生します。
はPublic Overrides Function Equals(ByVal obj As Object) As Boolean ...
は、その後、あなたがこのような過負荷を作成したいです誰かがメソッドをOverloadsとして宣言し、そのメソッドをオーバーロードしたい場合、同じエラーが発生します。 Overloadsキーワードをメソッドに追加するか、他のメソッドから削除する必要があります。
私は個人的にはオーバーロードされたメソッドを宣言しません。上記のような選択肢がない限り、オーバーロードされません。
私は、Overloadsキーワードを使用する必要がある状況に遭遇しました。
私は親クラスと継承クラスを持っていました。この例では
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
、私はオーバーロードキーワードを使用する必要がありました。
これはGoogleの検索結果が高く表示されているため、ここでより明確に説明できると思います。
同じクラス内でさまざまなメソッドをオーバーロードする場合は、Overloads
キーワードを使用する理由はありません。 Overloads
を使用する主な理由は、派生クラスが、オーバーロードされたメソッドと同じ名前で、異なるシグネチャを持つ基本クラスからメソッドを呼び出すことができるようにすることです。
Foo
とSonOfFoo
の2つのクラスがあるとします。ここで、SonOfFoo
はFoo
から継承しています。 Foo
がDoSomething
というメソッドを実装し、同じ名前のメソッドをSonOfFoo
が実装する場合、SonOfFoo
メソッドは、2つのメソッドが異なるパラメータをとっても、親クラスの実装を隠します。 Overloads
キーワードを指定すると、派生クラスはメソッドの親クラスのオーバーロードを呼び出すことができます。
ここで上記を実証するためのいくつかのコードを記述し、クラスの別のペア、Bar
とOverloads
キーワードを使用SonOfBar
として実装クラスFoo
とSonOfFoo
で、です:
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
はここで、これはコンパイル方法についてのsome informationですCLIでの動作が異なります。
デフォルトは 'Shadows'です。 –
私は世界で最も忘れやすい人でなければなりません。私はGoogleの検索からここに来て、私自身の答えを見たときに顔をぬけた。 –
機能についてはどうですか?何かを追加できますか? – beppe9000
- 1. scala:pimp私のライブラリoverloads
- 2. C#のキーワードVB.NETでは変数
- 3. JavaのキーワードVB.NETでは変数
- 4. VB.NET WithEventsキーワードの動作 - VB.NETコンパイラの制限?
- 5. VB.netにキーワードを追加しますか?
- 6. VB.NET/ASP.NET Withおよび新しいキーワードの混乱
- 7. vb.netはSQL文の予約済みキーワードをエスケープします
- 8. [Android] JavaのVB.NETの静的キーワードに相当するものは何ですか?
- 9. キーワード
- 10. nutch:キーワードで検索
- 11. jQuery.mapで「この」キーワード()
- 12. VB.NET Brackets(){} []
- 13. VB.NETクラスのインスタンス
- 14. VB.NETコードでのVB.NETイベントの処理
- 15. キーワードの後ろにないキーワードArg Python
- 16. は、キーワード
- 17. キーワード:メタデータ
- 18. Q_DECL_EXPORTキーワード
- 19. alignasキーワードとalignofキーワードはどのようなものですか?
- 20. VB.NETでのフィボナッチシーケンス
- 21. C#のEnumerationで予約されたキーワード
- 22. エラー次の例では、キーワード
- 23. javaでキーワード "this"を使用
- 24. キーワードでSPを検索
- 25. FileInfoでのキーワードの使用
- 26. PHPでユーザ定義のキーワード
- 27. javaのforeachキーワードですか?
- 28. キーワードでテキストエディタを書くハイライト
- 29. キーワードでPHPを検索
- 30. 'value'はjavaキーワードですか?
ああ、これらの役に立たないVB.NETキーワードの1つはプロパティの "ReadOnly"または "ByVal":D –
@RayKoopa Yup! (ただし、「オプション」はオプションではありません:D) – unnknown
悲しいことです。一方で、私はVS UservoiceのVB言語デザイナーと話をしました。その理由は、IDEが自動的にプロパティスタブやその他のものを自動的に生成するための言語をサポートする必要があるためです(たとえば、 "ReadOnly"を書くとスタブを取得するだけです)。実際、VBはIDEをサポートするように設計されていますが、VBをサポートするように設計されたIDEではありません。奇妙な! –