オブジェクト指向: クラス
目次
概要
変数とメソッドを機能毎にまとめたプログラム。
それをコピーして使用する事をインスタンス化。
※メモリ上にコピーする。インスタンス(実体)を作成する、Newする等言われる。
使用可能状態のクラスをオブジェクト、またはインスタンスと呼ぶ。
メンバー
クラス内のフィールド、メソッドの事。
(オブジェクト指向: 概要/用語(言語等による使い分け)参照)
※static変数、staticメソッドも含む
(静的クラス参照)
インスタンス変数(メンバー変数)
クラス内でのみ参照できるグローバル変数。クラス外からはインスタンスを通して参照する。
インスタンス毎に別々の値を持つ
別名:フィールド、メンバー変数
「オブジェクト指向: プロパティ・メソッド/クラス変数、インスタンス変数」参照
クラス変数
クラス外から参照できる変数。
クラス毎に単一の値を持つ
「オブジェクト指向: プロパティ・メソッド/クラス変数、インスタンス変数」参照
プロパティ
インスタンス変数にクラス外からアクセスする為のメソッド
別名:アクセサ、get(set)アクセサ、getter(setter)
(オブジェクト指向:プロパティ・メソッド参照)
メソッド
インスタンス変数等を用いたクラス内サブルーチン
public宣言する事でクラス外部から呼ばせる事が可能。
(オブジェクト指向:プロパティ・メソッド参照)
オーバーロード
多重定義
引数・戻り値の異なる同名のメソッドを定義する事。
似た機能を同名にする事で直感的に使いやすくなる。
設計時には名前衝突も起こり難い。
オブジェクト指向: プロパティ・メソッド/オーバーロード参照
コンストラクタ
インスタンスが作成された時に最初だけ呼ばれるメソッド。
インスタンス変数に初期値を与える使い方をする(事が多い)。
オブジェクト指向:コンストラクタ参照
デストラクタ
インスタンスが破棄される時に呼ばれるメソッド。
外部に公開して明示的に呼び出す事はしない。
オブジェクト指向:コンストラクタ/デストラクタ参照
イニシャライザ
クラスファイルがロードされたタイミングで実行されるメソッド。
コンストラクタよりも早い。
オブジェクト指向:コンストラクタ/イニシャライザ参照
名前空間(namespace/package)
複数のクラスで名前衝突を起こさない為に定義するクラスの所属場所
「オブジェクト指向: 名前空間」参照
継承
クラスをコピーし、コピー元クラスのメンバー全てを引き継ぐ事。
更に機能を付け足す事ができる。
複数のクラスを継承できる言語と単一のクラスしか継承できない言語がある。
オブジェクト指向:継承参照
オーバーライド
再定義。
ポリモーフィズムを実現する為に、基底クラスと同名の、しかし異なる機能のメソッドを定義する事。
「オブジェクト指向:継承/オーバーライド」参照
ポリモーフィズム
オーバーライドを用いてコーディング量を減らすテクニック。
「オブジェクト指向: ポリモーフィズム(多態性)」参照
インターフェース
継承先の派生クラスにメンバーの定義を強制できる機能を持つクラス。
クラスは複数のインターフェースを同時に「実装」できる。
インターフェースがインターフェースを実装する際は「継承」する。
(抽象クラスは1つしか継承できない:C#、JAVA等)
「オブジェクト指向:継承/インターフェース」参照
抽象クラス
継承先の派生クラスにメンバーの定義を強制できる機能を持つクラス。
継承(オーバーライド)させる事を前提としているのでメソッドには処理内容を書かない。
通常のクラスと同様1つのクラスしか継承できない。
(インターフェースは複数実装できる)
「オブジェクト指向:継承/抽象クラス」参照
オーバーライド・継承禁止宣言
クラス、メソッドのオーバーライド、継承を禁止させる機能
「オブジェクト指向:オーバーライド/継承禁止」参照
インスタンス化
$p->Method();
class MyClass{
function Method(){
print(“aaa”);
}
}
p.method()
->aaa
class MyClass:
def method():
print(“aaa”)
{
public int field1 { get; set; }
public string field2 { get; set; }
public int method(int prm)
{
return prm + 1;
}
}
static void Main(string[] args)
{
TEST test = new TEST();
test.field1 = 10;
test.field2 = @”prm”;
Console.WriteLine(value: test.method(prm:5) );
var test = new TEST();
Console.WriteLine(value: test.method(prm:5) );
型推論で変数を宣言と同時に初期化すると初期化時の型以外には使用できなくなる
Console.WriteLine(value: (new TEST()).method(prm: 5) );
インスタンス化と同時にフィールドの初期化
TEST test = new TEST()
{
field1 = 10,
field2 = @”prm”
};
}
MyClass myClass;
myClass.fnFunc();
C++は他の言語と違い、NEWしなくてもインスタンスが作成される。
この場合、インスタンスはスタック領域に作成され、プログラムの終了と共に自動的に削除される。
引数ありコンストラクタの場合
MyClass myClass(1, 2);
myClass.fnFunc();
(2)
MyClass *myClass;
myClass = &MyClass();
ポインタ変数にインスタンスのアドレスを格納
この場合、インスタンスはヒープ領域に作成され、明示的に削除する必要がある。
myClass->fnFunc();
delete myClass
引数ありコンストラクタの場合
MyClass *myClass;
myClass = &MyClass(1, 2);
myClass->fnFunc();
(3)
MyClass *myClass = new MyClass();
ポインタ変数にインスタンスのアドレスを格納
この場合、インスタンスはヒープ領域に作成され、明示的に削除する必要がある。
myClass->fnFunc();
delete myClass
引数ありコンストラクタの場合
MyClass *myClass = new MyClass(1, 2);
myClass->fnFunc();
(4)
(new MyParent())->fnFunc();
インスタンス作成と同時にメソッドを実行。
この場合、インスタンスはどこに作成されるのか不明。delete不要?
分かるまで使わない方が良いです。
Public Function method(ByVal prm As Integer) As Integer
Return prm + 1
End Function
End Class
Sub Main()
Dim test As TEST = New TEST()
Console.WriteLine(value:=test.method(prm:=5))
Console.WriteLine(value:= (New TEST()).method(prm:=5) )
End Sub
Set m = New MyClass
m.~ = ~
Call m.~(~)
Set m = Nothing
test.method();
new TEST().method();
new TEST(5).method();
特殊なクラス
クラス定義部分に直接アクセスし、インスタンス化時に作成(複写)されない。
静的クラス、静的インスタンス変数、静的メソッドがある。
スタティック領域にデータがあり、クラスから作成した複数のインスタンスで値を共有できる。
「オブジェクト指向: 特殊なクラス/静的クラス」参照
匿名クラス
プロパティ値を別オブジェクトとして渡す場合に利用。
一度しか利用しない為、定義やインスタンス化を省略。
「オブジェクト指向: 特殊なクラス/匿名クラス」参照
フレンドクラス/フレンド関数
指定したクラスに自クラスのインスタンス変数へのアクセスを認める機能
静的クラス/静的関数に近い。
「オブジェクト指向: 特殊なクラス/フレンドクラスフレンド関数」参照