オブジェクトは、1 つの単位として扱うことができるコードとデータの組み合わせです。 オブジェクトには、コントロールやフォームなどのアプリケーションの一部を指定できます。 アプリケーション全体をオブジェクトにすることもできます。
Visual Basic でアプリケーションを作成するときは、オブジェクトを常に操作します。 コントロール、フォーム、データ アクセス オブジェクトなど、Visual Basic によって提供されるオブジェクトを使用できます。 Visual Basic アプリケーション内の他のアプリケーションのオブジェクトを使用することもできます。 独自のオブジェクトを作成し、追加のプロパティとメソッドを定義することもできます。 オブジェクトは、プログラムの事前構築された構成要素のように機能します。コードを 1 回記述し、繰り返し再利用できます。
このトピックでは、オブジェクトについて詳しく説明します。
オブジェクトとクラス
Visual Basic の各オブジェクトは、 クラスによって定義されます。 クラスは、オブジェクトの変数、プロパティ、プロシージャ、およびイベントを記述します。 オブジェクトはクラスのインスタンスです。クラスを定義したら、必要な数のオブジェクトを作成できます。
オブジェクトとそのクラスの関係を理解するには、クッキーカッターとクッキーについて考えてください。 クッキーカッターはクラスです。 サイズや形状など、各クッキーの特性を定義します。 このクラスは、オブジェクトの作成に使用されます。 オブジェクトはクッキーです。
クラスのオブジェクトなしでアクセスできる Shared
メンバーを除き、そのメンバーにアクセスする前にオブジェクトを作成する必要があります。
クラスからオブジェクトを作成する
オブジェクトを作成するクラスを決定するか、独自のクラスを定義します。 例えば次が挙げられます。
Public Class Customer Public Property AccountNumber As Integer End Class
Dim ステートメントを記述して、クラス インスタンスを割り当てることができる変数を作成します。 変数は、目的のクラスの型である必要があります。
Dim nextCustomer As Customer
New Operator キーワードを追加して、変数をクラスの新しいインスタンスに初期化します。
Dim nextCustomer As New Customer
これで、オブジェクト変数を使用してクラスのメンバーにアクセスできるようになりました。
nextCustomer.AccountNumber = lastAccountNumber + 1
注
可能な限り、変数を割り当てるクラス型として宣言する必要があります。 これは 早期バインディングと呼ばれます。 コンパイル時にクラス型がわからない場合は、オブジェクト データ型の変数を宣言することで遅延バインディングを呼び出すことができます。 ただし、遅延バインディングによりパフォーマンスが低下し、実行時オブジェクトのメンバーへのアクセスが制限される可能性があります。 詳細については、「 オブジェクト変数の宣言」を参照してください。
複数インスタンス
クラスから新しく作成されたオブジェクトは、多くの場合、相互に同じです。 ただし、オブジェクトが個々のオブジェクトとして存在する場合は、他のインスタンスとは別に変数とプロパティを変更できます。 たとえば、フォームに 3 つのチェック ボックスを追加すると、各チェック ボックス オブジェクトは CheckBox クラスのインスタンスになります。 個々の CheckBox オブジェクトは、クラスによって定義された共通の特性と機能 (プロパティ、変数、プロシージャ、およびイベント) のセットを共有します。 ただし、それぞれが独自の名前を持ち、個別に有効または無効にすることができ、フォーム上の別の場所に配置できます。
オブジェクト メンバー
オブジェクトは、クラスの インスタンス を表すアプリケーションの要素です。 フィールド、プロパティ、メソッド、およびイベントは、オブジェクトの構成要素であり、 そのメンバーを構成します。
メンバー アクセス
オブジェクトのメンバーにアクセスするには、オブジェクト変数の名前、ピリオド (.
)、およびメンバーの名前を順番に指定します。 次の使用例は、Label オブジェクトのText プロパティを設定します。
warningLabel.Text = "Data not saved"
メンバーの IntelliSense の一覧
IntelliSense では、メンバー アクセス演算子としてピリオド (.
) を入力する場合など、そのリスト メンバー オプションを呼び出すときにクラスのメンバーが一覧表示されます。 そのクラスのインスタンスとして宣言された変数の名前の後にピリオドを入力すると、IntelliSense はすべてのインスタンス メンバーと共有メンバーの一覧を表示しません。 クラス名自体の後にピリオドを入力すると、IntelliSense によってすべての共有メンバーとインスタンス メンバーが一覧表示されません。 詳細については、「IntelliSense の使用」を参照してください。
フィールドとプロパティ
フィールド と プロパティ は、オブジェクトに格納されている情報を表します。 プロシージャでローカル変数を取得および設定するのと同じ方法で、代入ステートメントを使用して値を取得および設定します。 次の例では、Width プロパティを取得し、Label オブジェクトのForeColor プロパティを設定します。
Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red
フィールドは メンバー変数とも呼ばれます。
プロパティ プロシージャは、次の場合に使用します。
値を設定または取得するタイミングと方法を制御する必要があります。
プロパティには、検証する必要がある値の適切に定義されたセットがあります。
この値を設定すると、
IsVisible
プロパティなど、オブジェクトの状態が多少変化します。プロパティを設定すると、他の内部変数または他のプロパティの値が変更されます。
プロパティを設定または取得するには、一連の手順を実行する必要があります。
次の場合にフィールドを使用します。
値は自己検証型です。 たとえば、
True
またはFalse
以外の値がBoolean
変数に割り当てられている場合、エラーまたは自動データ変換が発生します。データ型でサポートされている範囲内の任意の値が有効です。 これは、
Single
型またはDouble
型の多くのプロパティに当てはまります。プロパティは
String
データ型であり、文字列のサイズまたは値に制約はありません。詳細については、「 プロパティ プロシージャ」を参照してください。
ヒント
非定数フィールドは常に非公開にしてください。 パブリックにする場合は、代わりにプロパティを使用します。
メソッド
メソッドは、オブジェクトが実行できるアクションです。 たとえば、 Add は、コンボ ボックスに新しいエントリを追加する ComboBox オブジェクトのメソッドです。
次の例では、Timer オブジェクトのStartメソッドを示します。
Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()
メソッドは単にオブジェクトによって公開される プロシージャ であることに注意してください。
詳細については、「プロシージャの」を参照してください。
イベント
イベントは、マウスのクリックやキーの押下など、オブジェクトによって認識されるアクションであり、応答するコードを記述できます。 イベントは、ユーザー アクションまたはプログラム コードの結果として発生する場合や、システムによって発生する可能性があります。 イベントを通知するコードはイベントを 発生 させると言われ、それに応答するコードは イベントを処理 すると言われます。
また、オブジェクトによって発生し、他のオブジェクトによって処理される独自のカスタム イベントを開発することもできます。 詳細については、「イベント」を参照してください。
インスタンス メンバーと共有メンバー
クラスからオブジェクトを作成すると、結果はそのクラスのインスタンスになります。 Shared キーワードで宣言されていないメンバーは、その特定のインスタンスに厳密に属するインスタンス メンバーです。 あるインスタンスのインスタンス メンバーは、同じクラスの別のインスタンスの同じメンバーから独立しています。 たとえば、インスタンス メンバー変数は、異なるインスタンスで異なる値を持つことができます。
Shared
キーワードで宣言されたメンバーは共有メンバーであり、特定のインスタンスではなく、クラス全体に属します。 共有メンバーは、作成するクラスのインスタンス数に関係なく、またはインスタンスを作成しない場合でも、1 回だけ存在します。 たとえば、共有メンバー変数には、クラスにアクセスできるすべてのコードで使用できる値が 1 つだけ含まれます。
共有されていないメンバーへのアクセス
オブジェクトがクラスから作成され、オブジェクト変数に割り当てられていることを確認します。
Dim secondForm As New System.Windows.Forms.Form
メンバーにアクセスするステートメントで、メンバー アクセス演算子 (
.
) とメンバー名を使用してオブジェクト変数名に従います。secondForm.Show()
共有メンバーへのアクセス
メンバー アクセス演算子 (
.
) とメンバー名を使用して、クラス名に従います。 常に、クラス名を使用してオブジェクトのShared
メンバーに直接アクセスする必要があります。Console.WriteLine("This computer is called " & Environment.MachineName)
クラスからオブジェクトを既に作成している場合は、オブジェクトの変数を使用して
Shared
メンバーにアクセスすることもできます。
クラスとモジュールの違い
クラスとモジュールの主な違いは、クラスをオブジェクトとしてインスタンス化できるのに対し、標準モジュールではインスタンス化できないことです。 標準モジュールのデータのコピーは 1 つだけであるため、プログラムの一部が標準モジュールのパブリック変数を変更すると、プログラムの他の部分がその変数を読み取ると、同じ値が取得されます。 これに対し、オブジェクト データは、インスタンス化されたオブジェクトごとに個別に存在します。 もう 1 つの違いは、標準モジュールとは異なり、クラスでインターフェイスを実装できることです。 MustInherit 修飾子でマークされたクラスは、直接インスタンス化できません。 ただし、モジュールは継承できますが、モジュールは継承できないため、モジュールとは異なります。
注
Shared
修飾子をクラス メンバーに適用すると、クラスの特定のインスタンスではなく、クラス自体に関連付けられます。 メンバーは、モジュール メンバーにアクセスするのと同じ方法で、クラス名を使用して直接アクセスされます。
クラスとモジュールでは、メンバーに異なるスコープも使用されます。 クラス内で定義されたメンバーは、クラスの特定のインスタンス内でスコープ指定され、オブジェクトの有効期間中のみ存在します。 クラスの外部からクラス メンバーにアクセスするには、 Object の形式で完全修飾名を使用する必要があります。メンバー。
一方、モジュール内で宣言されたメンバーは、既定でパブリックにアクセスでき、モジュールにアクセスできる任意のコードからアクセスできます。 つまり、標準モジュール内の変数は、プロジェクト内のどこからでも表示され、プログラムの有効期間中に存在するため、実質的にグローバル変数になります。
クラスとオブジェクトの再利用
オブジェクトを使用すると、変数とプロシージャを 1 回宣言し、必要に応じてそれらを再利用できます。 たとえば、アプリケーションにスペル チェックを追加する場合は、すべての変数とサポート関数を定義してスペル チェック機能を提供できます。 クラスとしてスペル チェックを作成する場合は、コンパイル済みアセンブリへの参照を追加することで、他のアプリケーションでスペル チェックを再利用できます。 さらに、他のユーザーが既に開発したスペル チェック クラスを使用して、いくつかの作業を自分で保存できる場合もあります。
.NET には、使用できるコンポーネントの例が多数用意されています。 次の例では、System名前空間の TimeZone クラスを使用します。 TimeZone には、現在のコンピューター システムのタイム ゾーンに関する情報を取得できるメンバーが用意されています。
Public Sub ExamineTimeZone()
Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
Dim s As String = "Current time zone is "
s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
s &= "different from UTC (coordinated universal time)"
s &= vbCrLf & "and is currently "
If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
s &= "on ""summer time""."
Console.WriteLine(s)
End Sub
前の例では、最初の Dim ステートメントはTimeZone型のオブジェクト変数を宣言し、CurrentTimeZone プロパティによって返されるTimeZone オブジェクトを割り当てます。
オブジェクト間のリレーションシップ
オブジェクトは、複数の方法で相互に関連付けることができます。 リレーションシップの主な種類は階層と包含です。
階層リレーションシップ
より基本的なクラスから派生したクラスは、 階層関係を持つと言われます。 クラス階層は、より一般的なクラスのサブタイプである項目を記述する場合に便利です。
次の例では、通常のButtonのように動作するが、前景色と背景色を反転させるメソッドも公開する特別な種類のButtonを定義するとします。
既存のクラスから派生したクラスを定義する
Class ステートメントを使用して、必要なオブジェクトの作成元となるクラスを定義します。
Public Class ReversibleButton
End Class
ステートメントがクラスの最後のコード行に従っていることを確認します。 既定では、Class
ステートメントを入力すると、統合開発環境 (IDE) によってEnd Class
が自動的に生成されます。inherits ステートメントを使用して、
Class
ステートメントにすぐに従います。 新しいクラスの派生元のクラスを指定します。Inherits System.Windows.Forms.Button
新しいクラスは、基底クラスによって定義されたすべてのメンバーを継承します。
派生クラスが公開する追加のメンバーのコードを追加します。 たとえば、
ReverseColors
メソッドを追加すると、派生クラスは次のようになります。Public Class ReversibleButton Inherits System.Windows.Forms.Button Public Sub ReverseColors() Dim saveColor As System.Drawing.Color = Me.BackColor Me.BackColor = Me.ForeColor Me.ForeColor = saveColor End Sub End Class
ReversibleButton
クラスからオブジェクトを作成すると、Button クラスのすべてのメンバー、ReverseColors
メソッド、およびReversibleButton
で定義したその他の新しいメンバーにアクセスできます。
派生クラスは、基になるクラスからメンバーを継承するため、クラス階層の進行に合わせて複雑さを追加できます。 詳細については、「継承の 基本」を参照してください。
コードをコンパイルする
コンパイラが、新しいクラスの派生元となるクラスにアクセスできることを確認してください。 これは、前の例のように名前を完全に修飾すること、または Imports ステートメント (.NET 名前空間と型) でその名前空間を識別することを意味する可能性があります。 クラスが別のプロジェクトにある場合は、そのプロジェクトへの参照の追加が必要になる場合があります。 詳細については、「プロジェクト内の参照の管理」を参照してください。
含有リレーションシップ
オブジェクトを関連付けることができるもう 1 つの方法は、 包含関係です。 コンテナー オブジェクトは、他のオブジェクトを論理的にカプセル化します。 たとえば、 OperatingSystem オブジェクトには論理的に Version オブジェクトが含まれており、 Version プロパティを通じて返されます。 コンテナー オブジェクトには、他のオブジェクトが物理的に含まれていないことに注意してください。
コレクション
1 つの特定の種類のオブジェクト包含が コレクションによって表されます。 コレクションは、列挙可能な類似オブジェクトのグループです。 Visual Basic では、 For Each..で特定の構文がサポートされています。次のステートメント を使用すると、コレクションの項目を反復処理できます。 また、コレクションでは、多くの場合、 Item[] を使用して、インデックスまたは一意の文字列に関連付けることで要素を取得できます。 コレクションは、インデックスを使用せずに項目を追加または削除できるため、配列よりも使いやすい場合があります。 使いやすさのため、コレクションは多くの場合、フォームとコントロールを格納するために使用されます。
関連トピック
チュートリアル: クラスの定義
クラスを作成する方法の詳細な説明を提供します。
オーバーロードされたプロパティとメソッド
オーバーロードされたプロパティとメソッド
継承の基本
継承修飾子、メソッドとプロパティのオーバーライド、MyClass、および MyBase について説明します。
オブジェクトの有効期間: オブジェクトの作成方法と破棄方法
クラス インスタンスの作成と破棄について説明します。
匿名型
匿名型を作成して使用する方法について説明します。これにより、データ型のクラス定義を記述せずにオブジェクトを作成できます。
オブジェクト初期化子: 名前付き型と匿名型
1 つの式を使用して名前付き型と匿名型のインスタンスを作成するために使用されるオブジェクト初期化子について説明します。
方法: 匿名型宣言でプロパティ名と型を推論する
匿名型宣言でプロパティ名と型を推論する方法について説明します。 成功した推論と失敗した推論の例を示します。
.NET