10 月 2008 のアーカイブ

ActiveBasic5に追加された新機能その2
~クラスが参照型へ変更~

ActiveBasic5クラスは、これまでのActiveBasic4のクラスの仕様から、

大きく仕様変更された点が「参照型」への変更です。

ActiveBasic5以前のクラスは「値型」だったのですが、値型から参照型に仕様が変更となって

何が一番大きく変わったかといいますと、「=」による代入の意味が大きく変わることになります。

まずは「値型」の代入例として構造体を見てみましょう。

Type Pos
    x As Double
    y As Double
End Type

上記のような構造体が定義されている場合、次のようにすると

最初に定義された構造体の中身(メンバ変数)だけが「=」によってコピーされます。

#console
 
Dim a = [ 2.0, 3.0 ] As Pos
Dim b = a
 
Print b.x
Print b.y

しかし、構造体型の変数のアドレスをみると変数aと変数bは全くの別物です。

そのため、変数a変数bにコピーした後で、変数aを変更しても変数bには影響がありません。

これはActiveBasic4の頃のクラスの仕様も同じです。

一方のActiveBasic5で参照型に変更されたクラスはこれとは異なる振る舞いをします。

下記がそのサンプルです。

#console
 
Class Pos
Public
    x As Double
    y As Double
 
    Sub Pos( x As Double, y As Double )
        This.x=x
        This.y=y
    End Sub
End Class
 
Dim a = New Pos( 4.0, 5.0 )
Dim b = a
 
Print b.x
Print b.y

これを実行しますと、構造体のコピーと同じようにクラスaクラスbのメンバ変数の値は等しくなります、

しかしながらこの時の、クラスaクラスb同じもの(インスタンス)を指し示しています。

即ち、クラスbクラスaとは名前は違えど、中身は同一のクラスとなります。

クラスが、参照型に変更された理由はガベージコレクションと深い関係にありますが、

それはまた次回に紹介します.

Comments コメントなし »

前回に引き続き、名前空間の話題でいきます。

前のサンプルプログラムでは簡単ですが、名前空間の定義法と使用法をお見せしましたが、

今回はもう少し、詳しい仕様を紹介しておきます。

基本的に名前空間内Namespace ~ End Namesapce間には

Const
Const Enum
Class
Dim
Enum
Function
Interface
Sub
Type
TypeDef

だけです。これがどういった区分になっているか分かりにくいように思われますが、

これは実に簡単なことで、名前空間内ではフローに関わるようなプログラムを書くことはできません。

要するにIfForなどをはじめとするステートメントを名前空間内へ直接記述することはできません。

これは名前空間があくまでも名前の衝突を防ぐために使われるものだからです。

つづいて、名前空間の定義時の注意点をまとめてますと、

  • 名前空間の名前は半角数字で、先頭の文字は英字のみで大文字と小文字は区別される
  • 同じ名前の名前空間が作成されると結合される
  • 名前空間は異なる名前空間で入れ子構造にすることができる

下記に簡単な名前空間のサンプルプログラムを紹介しておきます。
コンパイルの設定はいつもの通り、DOSプロンプトです。
それと、DOSのサンプルの場合は先頭に#consoleをつけることにしました。

#console
'結合
Namespace Name1
    Const A = 10
    Dim B As Long
End Namespace

Namespace Name1
    Sub C()
        Print A*B
    End Sub
End Namespace

'入れ子
Namespace name1
    Namespace name2
        Sub D()
            Print 100
        End Sub
    End Namespace
End Namespace

Name1.B = 5
Name1.C()

name1.name2.D()

Sleep(-1)

 

これで、名前空間のだいたいの使い方は分かっていただけるたと思いますが、

最後にImportsステートメントに触れておきたいと思います。

と、いうよりもこのImportsを説明したかったがためにここまで長ったらしい説明をしてきましたw

名前空間を定義して使用する場合、名前空間内の関数や変数にアクセスするためには、

サンプルを見ても分かる通り、名前空間名に「.」ピリオドをつけてなければいけませんが、

名前空間内の関数や変数に直接アクセスしたい場合に、このImportsを使います。

下にそのサンプルをのせます。

#console
Namespace Name2
   Dim A As Long
End Namespace

Imports Name2

A = 108
Print A

Sleep(-1)

こっちもそれほど難しくはないとおもいますが、

たとえば、Importsで取り込みたい2つの名前空間で同じ名前の変数や関数が使われている場合は

コンパイルエラーになってしまいますので、どちらか一方だけを取り込んで、

もう一方は取り込まずに名前空間名を付けて呼び出す必要があります。

 

さて、どうして名前空間を最初に紹介したかと言いますと、

今後、紹介していくであろうクラスライブラリはこの名前空間で管理されているからです。

次回は、参照型になったクラスについて紹介したいと思います。

Comments コメントなし »