2017-05-10 18 views
1

私はベースクラスと派生クラスを持っていますが、ベースクラスは派生クラスでオーバーライドされる2つのメソッドを持っています。のは、次のシナリオを見てみましょう:今、私は、派生クラスのインスタンスを作成しているベースの空のメソッドを呼び出す派生クラスのインスタンス

私の基本クラス

public class BaseClass 

public Overridable function method1() 

method2() 
End Function 

public Overridable function method2() 
' Empty !!! 
End Function 
End class 

私の派生クラス

public class DerivedClass 

public Overrides function method1() 

MyBase.method1() 
End Function 

public Overrides function method2() 

' Some code !! 
End Function 
End class 

と法1()を呼び出します。

Dim obj as new DerivedClass() 
obj.method1() 

method1()は、ベースのmethod2()を呼び出すベースのmethod1()を呼び出します。私には奇妙なことは、空になっているbase2のmethod2は、派生したメソッド2と呼ばれています! ..

どのようなことが起こっているのか、どのように継承されたメソッドを呼び出すことができますか?この概念にはどのような概念が適用されましたか?

答えて

1

method1()は、ベースのメソッドmethod1()を呼び出し、メソッド2をベースで呼び出します。

ここが間違っています。

メソッド2はオーバーライド可能なので、「仮想メソッド」です。したがって、method2を呼び出すと、オーバーライドされたバージョンが呼び出されます。 C#での仮想メソッドのようなVBで

Public Class BaseClass 
    Public Overridable function method1() 
     method2() ' <-- If method2 has been overridden, the overridden 
        '  version is called here. 
    End Function 
    ... 
End Class 
+0

を参照してください。空のオーバーライド可能なメソッドは「仮想メソッド」です。コンパイラは、Emptyメソッドの代わりに、オーバーライドされたメソッドを実行する必要があることをどのように知っていますか? –

+0

@AreejQadomi:*すべての*オーバーライド可能なメソッド(空のメソッドだけではない)は "仮想メソッド"です。コンパイラはそれを知らない。 *実行時*は、オブジェクトの具体的な型が "DerivedClass"であることを知っているので、method2の実装を呼び出す必要があります。そのため、これは "*実行時*多型"と呼ばれます。 – Heinzi

1

オーバーライド可能な方法は、直接呼び出されていませんが、一般的にメソッドへのポインタが含まれているのvtableと呼ばれるものを採用する:これは、基本クラスの法1における方法2の呼び出しが含まれています。このようにして、BaseClass型のインスタンスがある場合、vtableはオーバーライド可能なメソッドのBaseClassバージョンを指します。 DerivedClassのインスタンスを持つと、メソッドのバージョンへのポインタがvtableにあったものを上書きします。メソッドが呼び出されると、派生クラスのバージョンが呼び出されます。 vtableの詳細については、this question

関連する問題