VB.NET--OVERLOADS,OVERRIDES,SHADOWS

14977 ワード


  
    
1 Public Class TheBase
2 Public Overridable Sub a()
3 Debug.Writeline( " TheBase " )
4 End Sub
5 End Class
6
7 Public Class TheInherited
8 Inherits TheBase
9 Public Overrides Sub a()
10 Debug.Writeline( " TheInherited " )
11 End Sub
12 End Class
13
14 Public Class TheShadowed
15 Inherits TheInherited
16 Public Shadows Sub a()
17 Debug.Writeline( " TheShadowed " )
18 End Sub
19 End Class
20
21 '
22   Dim c As TheBase
23 c = New TheBase()
24 c.a() ' TheBase
25   c = New TheInherited()
26 c.a() ' TheInherited
27   c = New TheShadowed()
28 c.a() ' TheInherited
29
30 '
31 Dim c As TheInherited
32 c = New TheBase()
33 c.a() ' ! 。
34 c = New TheInherited()
35 c.a() ' TheInherited
36 c = New TheShadowed()
37 c.a() ' TheInherited
38
39 '
40 Dim c As TheShadowed
41 c = New TheBase()
42 c.a() ' ! 。
43 c = New TheInherited()
44 c.a() ' ! 。
45 c = New TheShadowed()
46 c.a() ' TheShadowed

この例では、Overridable、Overrides、Shadowsの使い方を説明します.TheBaseのOverridableに注意してください.この文がなければ、後のクラスTheInheritedは同じ名前のプロシージャa()を宣言できませんが、TheShadowsはまだできます.Overridableとは、書き換えることができるという意味です.Overridesの意味は、元のものを書き直すことです.Shadowsの意味は、この関数/プロシージャ/変数は私の親とは何の関係もなく、新しいプロシージャです.実行例では、変数cの定義が何であるかにかかわらず、VBを明確に見ることができる.NETは、最後に定義されたメンバーをできるだけ探します.つまり、書き換えられたら、「変数タイプから、この変数が指すオブジェクトの実際のクラスまで、最後に書き換えられたメンバー」を探します.△もちろん、見つからない場合は、変数タイプの祖先の方向にも行きます.簡単に言えば、cがどのように決めても、もし彼がTheBaseを指していたら、彼は「TheBaseまで最後に書き直されたSub a()」を見つけたということです.もし彼がTheInheritedを指していたら、「TheInheritedまで最後に書き直されたSub a()」、つまりTheInheritedの中のあれを探します.TheShadowedにとって、状況は少し複雑です:TheShadowedに書かれているa()がShadowsと宣言されているため、つまりこのa()はTheBaseやTheInheritedの中に関係なく、変数cのベースクラス(TheBase)から探し始め、変数が指すオブジェクトのタイプTheShadowedを見つけ続けました.変数cのタイプ(TheBaseでもTheInheritedでも)の中のa()が最後に書き換えられたのはTheInheritedの中(注意:TheShadowsの中のa()は関係ない)であることを発見して、そこでcがDimでない限り..As TheShadowsは、TheInheritedの中のa()を呼び出すことを選択します.
リロード規則
同じ名前で2つ以上のプロパティまたはメソッドを追加すると、クラスのリロードメンバーを作成できます.派生メンバーの再ロードに加えて、各再ロードメンバーには異なるパラメータリストが必要です.属性またはプロシージャを再ロードする場合、次のアイテムは区別フィーチャーとして使用できません.
  • は、ByValまたはByRefのようなメンバーまたはメンバーパラメータの修飾子に適用される.
  • パラメータ名
  • プロシージャの戻りタイプ
  • リロード時にキーワードOverloadsはオプションですが、いずれかのリロードメンバーがOverloadsキーワードを使用している場合は、他のすべての同じ名前のリロードメンバーもキーワードを指定する必要があります.
    派生クラスは、同じパラメータとパラメータタイプを持つメンバーで継承メンバーを再ロードできます.このプロシージャは、「名前と署名で非表示」と呼ばれます.名前と署名で非表示にするときにOverloadsキーを使用すると、ベースクラスのインプリメンテーションではなくメンバーの派生クラスインプリメンテーションが使用され、そのメンバーの他のすべてのリロードが派生クラスのインスタンスで使用できます.
    同じパラメータとパラメータタイプを持つメンバーで継承メンバーを再ロードするときにOverloadsキーを省略する場合、この再ロードは「名前で非表示」と呼ばれます.置換メンバーの継承インプリメンテーションを名前で非表示にし、派生クラスおよび派生クラスのインスタンスに対して他のすべてのリロードが使用できないようにします.
    OverloadsとShadows修飾子は、同じプロパティまたはメソッドで同時に使用できません.