RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/081/
INDEXに戻る

OOP University:パート 5

前回のレッスンでは、オブジェクトについて詳しく知るには充分ではありませんでしたが、今回はさらに詳しく説明します。(またアップデートが遅れていることについてお詫び申し上げます:Macworld Expoに参加していたため遅れてしまいました。今週は、遅れを取り戻すために2つのコラムを発表しようと思います。)

インスタンス

これまでに我々が学んできたことは、カテゴリーと特性についてです。OOPの用語では、これらはクラス属性として知られています。クラスは、単なるオブジェクトのカテゴリー(概念)です。属性は、単なるオブジェクトの特性です。単純です!

しかし、それからOOPの概念となると、それは本当に混乱することになります。インスタンス。一体何がインスタンスなのでしょう?

しばらくの間、科学者が物事を分類する話題に戻りましょう。彼は、オブジェクトのクラス(OOP用語で)を作成します。彼は、猫のオブジェクトを記述するクラスを作成します。しかし、それは猫ではありません。それは何でもありません。それはオブジェクトでさえもありません。それは猫のオブジェクトの定義、あるいは記述にしか過ぎません。

これは難解ですが、とても重要ですので、繰り返し述べさせてください:

クラスは、記述にしか過ぎません。

なぜ、それはとても重要なのでしょうか?なぜなら、それがクラスインスタンスの違いだからです。

クラスはオブジェクトがどのようであるかを記述します。インスタンスそのオブジェクトです。

インスタンスはMischief、あるいはMayhemです。MischiefとMayhemは、catObjectClassのインスタンスです。インスタンスは実際の猫のオブジェクトで、猫のオブジェクトの記述ではありません。

理解できましたか?あなたがそれを理解することはとても重要です。その違いを理解するために、正式な訓練を積まない私には数年かかりました。クラスとインスタンスの違いは、オブジェクト指向プログラムの最も基本的な原理のひとつです。

そのふたつの違いには、もうひとつ重要な点があります。クラスは、特性のリストというただの記述にしか過ぎないので、その属性は実際には値を持つことができません。

それは私が今まで使用してきた分類の例えを、基本的にぶち壊すものです。そしてOOPを理解するうえで、最も大きな挑戦のうちのひとつです。例えば、始めに私が紹介した図式では、animateObjectClassにおいて、"alive = true"と設定しました。それが科学者がオブジェクトを分類する方法ではありますが、それはOOPの流儀ではありません。技術的に言うと、オブジェクト指向プログラムでは、それを行うことはできません。"alive"属性を定義できますが(論理型、文字列、あるいは整数のような属性が持つデータを特定する)、その属性のは定義できません。

クラスは、オブジェクトの属性の単なる定義であることを覚えておいてください。それらの属性は、まだ何もオブジェクトがありませんので、値を持ちません!

一度、オブジェクトのインスタンスを作成してしまえば、それから、あなたはインスタンスに値を割り当て始めることができます。言い換えれば、catObjectClassは空です:しかしmischiefInstanceは本物の猫、Mischiefです。mischiefInstancecatObjectClassで定義された属性を持ちますが、最初は何も値を持ちません。インスタンスを作成した後、プログラム的に(あるいはREALbasicの属性ウィンドウで)、それらの属性のを設定します。

この概念の逆もまた真であることに注意してください:インスタンスの属性を、加えたり、変更したり、あるいは削除したりはできません

ここに、インスタンスと比較したクラスの主な特徴を示す表があります:

クラス 属性を加えたり、変更したりできる
属性の値を設定できない
属性を削除できない
インスタンス 属性の値を設定できる
属性を加えたり、変更したりできない
属性を削除できない

これを覚えるために、よい方法があります:クラスが単なる定義であるのと同じように、属性も定義です。インスタンスが、オブジェクトの具体的な実体であるように、属性のもまたそのようなものです。

再びREALbasicへ

今まで、我々は抽象的な方法でオブジェクトについて述べてきました。このような基本的なオブジェクトの概念は、言語に依存しません。

しかし、あなたがREALbasicに慣れていることもあり、またおそらく、これらの特徴の大部分を適切な理解なしに既に使用しているので、REALbasicではこれがどのようになっているか見てみることにしましょう。

これをREALbasicのプログラムでは、属性の定義には、dim文を使用します:

  
alive as boolean

あなたがREALbasicを使い込んでいるならば、これがaliveをセットせずに、単に、論理型変数として定義していることは明白でしょう。

インスタンスは属性を定義できませんが、属性の値は定義(設定)できます:

  
alive = true

次はcatObjectClass(animateObjectClassのサブセット)の定義です:

  
Class catObjectClass
dim legs as integer
dim mammal as boolean
dim personality(0) as string
dim species as string
dim theColor as string
dim thePicture as picture
end Class

catObjectClassインスタンスを作成するために、我々は基本的に、そのオブジェクトのデータ型の変数を作成します。それは次のようになります:

  
dim mischiefInstance as catObjectClass

これをどこで行うのでしょうか?それは、あなたがオブジェクトで何をするかに依存します。ウィンドウ、あるいはモジュールの属性として(その場合では、"dim"コマンドは必要ありません)、あるいはpushButtonメソッド、あるいは他のコードブロック(この場合には、オブジェクトはそのコードブロック内だけでアクセスすることができます)内で、定義することができるでしょう。

さらに、インスタンスを作成するための別の方法があります:あなたのプロジェクト・ウィンドウからプロジェクトのウィンドウ(例えばWindow1のような)に、catObjectClassをドラッグできます。これは、まさしくlistBoxやその他の定義済みのコントロールを、ウィンドウにドラッグするのと同じです!

この場合には、REALbasicはオブジェクトのインスタンスを作成し、それをそのウィンドウ上に配置します。あなたは自由にそれを選択し、その属性を変更できます。詳しくは、次回に解説します!

次週

例題用プロジェクトを用いて、さらに詳しく、これらの概念について検討します。

Letters

今週は、タブ・パネルについての質問を、Kenさんから頂きました。

プログラムの実行時に、既存のタブ・パネルに付加タブを追加することは可能でしょうか…私はTCP/IPを通じて情報の流れを読むアプリケーションについて取り組んでいます。それが個別の区画を解析するとき、私はそれぞれについてタブを作成し、それからそれぞれのタブ・パネルで、その区画で見つかった情報を表示したいのです。

よろしくお願いします
Ken

手短に答えます:それはできません。新たなタブを追加する唯一の方法は、IDEにおいてです。しかし、プログラム的にタブの名前を変更することができますので、余分のタブを予め作成しておき、その名前を実行中に適当に変更することができるでしょう。これは、あなたの必要な付加タブが決まった個数の場合のみ有効でしょう。この手法の主な不都合な点は、"空白"(未使用)のタブが表示されることです。わずかな数のタブだけが必要の場合は、互いに異なる数のタブを持つ、数枚のタブ・パネルを予め作成し、その内のひとつを表示させるか、ウィンドウの境界内に置くことによって、理論的にはこの問題を回避することができるでしょう。しかし、それは幾分複雑です。

よりよい解決策は、ページパネル(pagePanel)を使用することでしょう(ページパネルはREALbasic 4.5で導入されています)。ページパネルは、パネル自身が非表示である点を除いて、タブパネル(tabPanel)に似ています。ページパネルでは、あなたの好きな外観やインターフェースを実現できます。一連のアイコン、あるいはユーザがクリックするためのテキスト・ラベル、矢印やスクロール・バー、その他どのようなものでも実現することができます。どのパネルを現時点で表示するのかを、プログラム的に制御するのはあなた次第です。

ページパネルもまた、プログラム的にパネルを追加することは不可能ですが、パネルは非表示ですので、あなたの必要なだけの最大数のパネル(例えば20や50)を作成し、余分なものは使用しないこともできます。インターフェースやパネルの表示を制御できるので、それが最後のパネルである場合は、ユーザにそれ以上のパネルに進めないようにさせることも簡単にできることを覚えておきましょう。

簡単なデモ・プログラムで、これを行いました:

このデモは、動的にパネルの数を(最大22まで)設定することができ、それをスクロールします。パネルの数の変更後は、スクロールバーは新しい最大数を反映するよう変化します。もちろん、あなたのプログラムでは、もっと見栄えのよいインターフェースを導入できるでしょう!


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る