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つ以上のプロパティまたはメソッドを追加すると、クラスのリロードメンバーを作成できます.派生メンバーの再ロードに加えて、各再ロードメンバーには異なるパラメータリストが必要です.属性またはプロシージャを再ロードする場合、次のアイテムは区別フィーチャーとして使用できません.
派生クラスは、同じパラメータとパラメータタイプを持つメンバーで継承メンバーを再ロードできます.このプロシージャは、「名前と署名で非表示」と呼ばれます.名前と署名で非表示にするときにOverloadsキーを使用すると、ベースクラスのインプリメンテーションではなくメンバーの派生クラスインプリメンテーションが使用され、そのメンバーの他のすべてのリロードが派生クラスのインスタンスで使用できます.
同じパラメータとパラメータタイプを持つメンバーで継承メンバーを再ロードするときにOverloadsキーを省略する場合、この再ロードは「名前で非表示」と呼ばれます.置換メンバーの継承インプリメンテーションを名前で非表示にし、派生クラスおよび派生クラスのインスタンスに対して他のすべてのリロードが使用できないようにします.
OverloadsとShadows修飾子は、同じプロパティまたはメソッドで同時に使用できません.