Linux(mono)でVB、継承(その8)

myname=”動物”ってのを、継承で”犬”に上書きしようとしてたこと自体が間違っていたかもしれません。犬は動物であることに変わりありませんから。上書きして違うものにしてはいけないと思うんです。継承って変身することではないですからね。
動物という情報は残しつつ、継承したときに、分類名が増えるようにするのが正解でしょう。
動物という情報は、classnameという変数に格納することにします。
そして、犬という情報は、familynameに格納します。

takk@deb9:~/vbtest$ cat -n test.vb
     1  Imports System.Console
     2
     3  Public Class Animal
     4          Public classname As String = "哺乳類"
     5          Sub Tell()
     6                  WriteLine( classname & "です")
     7          End Sub
     8  End Class
     9
    10  Public Class Dog : inherits Animal
    11          Public familyname As String = "犬"
    12          Sub Tell()
    13                  WriteLine( MyBase.classname & "で" & familyname & "です")
    14          End Sub
    15  End Class
    16
    17  Public Class TestClass
    18          <STAThread()> _
    19          Shared Sub Main()
    20                  dim dog as new Dog()
    21                  dog.Tell()
    22          End Sub
    23
    24  End Class
takk@deb9:~/vbtest$

このようになりました。

ビルド。

takk@deb9:~/vbtest$ vbnc test.vb
Visual Basic.Net Compiler version 0.0.0.5943 (Mono 4.0.1 - tarball)
Copyright (C) 2004-2010 Rolf Bjarne Kvinge. All rights reserved.

Assembly 'test, Version=0.0, Culture=neutral, PublicKeyToken=null' saved successfully to '/home/takk/vbtest/test.exe'.
Compilation successful
Compilation took 00:00:00.5070190
takk@deb9:~/vbtest$ mono test.exe
哺乳類で犬です
takk@deb9:~/vbtest$

犬になって、ようやく吠える、というふるまいができるのだから、BarkメソッドはDogクラスに実装するべきですね。

    10  Public Class Dog : inherits Animal
    11          Public familyname As String = "犬"
    12          Sub Tell()
    13                  WriteLine( MyBase.classname & "で" & familyname & "です" )
    14          End Sub
    15          Sub Bark()
    16                  WriteLine( "Bowwow" )
    17          End Sub
    18  End Class
    19
    20  Public Class TestClass
    21          <STAThread()> _
    22          Shared Sub Main()
    23                  dim dog as new Dog()
    24                  dog.Tell()
    25                  dog.Bark()
    26          End Sub
    27
    28  End Class
takk@deb9:~/vbtest$

ビルド、実行。

takk@deb9:~/vbtest$ vbnc test.vb

~省略~

takk@deb9:~/vbtest$ mono test.exe
哺乳類で犬です
Bowwow
takk@deb9:~/vbtest$

Animalもつかって動物を実装してみます。

    20  Public Class TestClass
    21          <STAThread()> _
    22          Shared Sub Main()
    23                  dim dog as new Dog()
    24                  dog.Tell()
    25                  dog.Bark()
    26
    27                  dim animal as new Animal()
    28                  animal.Tell()
    29                  animal.Bark()
    30          End Sub
    31
    32  End Class
takk@deb9:~/vbtest$

ビルドすると、

takk@deb9:~/vbtest$ vbnc test.vb
Visual Basic.Net Compiler version 0.0.0.5943 (Mono 4.0.1 - tarball)
Copyright (C) 2004-2010 Rolf Bjarne Kvinge. All rights reserved.

/home/takk/vbtest/test.vb (29,10) : error VBNC30456: 'Bark' is not a member of 'Animal'.
There were 1 errors and 0 warnings.
Compilation took 00:00:00.4391430
takk@deb9:~/vbtest$

動物は吠えるメソッドを持っていませんので、エラーとなりました。
正しいエラーです。

だんだん、継承のことが分かってきた気がします。

コメント

タイトルとURLをコピーしました