C#では、次のコードがあります。
- 仮想InitClass()関数を持つ基本クラス
- InitClass()関数をオーバーライドする子クラス。この関数では、プライベート変数を設定します
私の私有地を公開している公有財産
namespace InheritenceTest { class Program { static void Main(string[] args) { ChildClass childClass = new ChildClass(); Console.WriteLine(childClass.SomeString); Console.ReadLine(); } } public class BaseClass { public BaseClass() { InitClass(); } protected virtual void InitClass() { // Do Nothing here } } public class ChildClass: BaseClass { private string _someString = "Default Value"; public ChildClass() { } protected override void InitClass() { base.InitClass(); _someString = "Set in InitClass()"; } public string SomeString { get { return _someString; } set { _someString = value; } } } }
このプログラムからのコンソール出力は「SetinInitClass()」です。
次に、このコードをVB.NETに変換しました。
Imports System
Imports System.Collections.Generic
Imports System.Text
Namespace InheritenceTest
Module Program
Public Sub Main(ByVal args As String())
Dim childClass As New ChildClass()
Console.WriteLine(childClass.SomeString)
Console.ReadLine()
End Sub
End Module
Public Class BaseClass
Public Sub New()
InitClass()
End Sub
Protected Overridable Sub InitClass()
' Do Nothing here
End Sub
End Class
Public Class ChildClass
Inherits BaseClass
Private _someString As String = "Default Value"
Public Sub New()
End Sub
Protected Overrides Sub InitClass()
MyBase.InitClass()
_someString = "Set in InitClass()"
End Sub
Public Property SomeString() As String
Get
Return _someString
End Get
Set(ByVal value As String)
_someString = value
End Set
End Property
End Class
End Namespace
このVB.NETプログラムの出力は「デフォルト値」です。
デバッグ中にコード(VB.NETコード)を見ると、コンストラクターがその仕事を終えたときにデフォルト値が設定されているのに対し、C#の場合はその逆であることがわかります(最初にコンストラクターよりもデフォルト値が設定されます)と呼ばれます)。
なぜこれが当てはまるのか誰かが私に説明できますか?そして、2つの言語のどちらが「正しい」ですか?