2009-07-23 8 views
14

メソッドをオーバーロードするには本当にこのキーワードが必要ですか?オーバーロードキーワードの使用と異なるメソッドシグニチャの違いとは何ですか?VB.NETで "Overloads"キーワード

答えて

15

同じクラス内で、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を参照してください。

+1

ああ、これらの役に立たないVB.NETキーワードの1つはプロパティの "ReadOnly"または "ByVal":D –

+0

@RayKoopa Yup! (ただし、「オプション」はオプションではありません:D) – unnknown

+0

悲しいことです。一方で、私はVS UservoiceのVB言語デザイナーと話をしました。その理由は、IDEが自動的にプロパティスタブやその他のものを自動的に生成するための言語をサポートする必要があるためです(たとえば、 "ReadOnly"を書くとスタブを取得するだけです)。実際、VBはIDEをサポートするように設計されていますが、VBをサポートするように設計されたIDEではありません。奇妙な! –

9

これは設計上の考慮事項でした。もちろん、それは関数シグネチャ(C#のような)によってオーバーロードを推測するように設計されている可能性があります。そのため、Overloadsキーワード自体は省略できましたが、最終的にVisual Basicの表現力(オーバーヘッドを考慮する)それは言語設計の決定に過ぎませんでした。

+0

OPはなぜオーバーロードするのかを質問しています(メソッドに異なる名前をつけているのに対して)。 –

+4

@Adrian Godong:OPは、オーバーロードが便利であるかどうか(異なるメソッド名を使用するのではなく) –

+0

@Adrian:それは間違っている - 彼はキーワード – Dario

0

Overloads - キーワードは完全にオプションです。使用上の利点はありません。

+0

OPはなぜオーバーロードするのか(なぜなら、メソッドの名前が違う)、なぜoverloadキーワードを使用しないのかを尋ねています。 –

+0

それは間違っています - 彼はキーワードについて尋ねます:彼は名前については話しませんが署名は、我々はそのオーバーロードと呼んでいます – Dario

3

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キーワードをメソッドに追加するか、他のメソッドから削除する必要があります。

私は個人的にはオーバーロードされたメソッドを宣言しません。上記のような選択肢がない限り、オーバーロードされません。

2

私は、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 

、私はオーバーロードキーワードを使用する必要がありました。

15

これはGoogleの検索結果が高く表示されているため、ここでより明確に説明できると思います。

同じクラス内でさまざまなメソッドをオーバーロードする場合は、Overloadsキーワードを使用する理由はありません。 Overloadsを使用する主な理由は、派生クラスが、オーバーロードされたメソッドと同じ名前で、異なるシグネチャを持つ基本クラスからメソッドを呼び出すことができるようにすることです。

FooSonOfFooの2つのクラスがあるとします。ここで、SonOfFooFooから継承しています。 FooDoSomethingというメソッドを実装し、同じ名前のメソッドをSonOfFooが実装する場合、SonOfFooメソッドは、2つのメソッドが異なるパラメータをとっても、親クラスの実装を隠します。 Overloadsキーワードを指定すると、派生クラスはメソッドの親クラスのオーバーロードを呼び出すことができます。

ここで上記を実証するためのいくつかのコードを記述し、クラスの別のペア、BarOverloadsキーワードを使用SonOfBarとして実装クラスFooSonOfFooで、です:

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での動作が異なります。

+0

デフォルトは 'Shadows'です。 –

+19

私は世界で最も忘れやすい人でなければなりません。私はGoogleの検索からここに来て、私自身の答えを見たときに顔をぬけた。 –

+0

機能についてはどうですか?何かを追加できますか? – beppe9000

関連する問題