CとJavaによるオブジェクト指向プログラミング
〈プログラミングの原則〉
一つのプログラムの中に同じようなコードを重複して記述しないこと!
オブジェクト:変数(variable)とその変数を操作する関数(function)の集まり。状態(state)と動作(behaviour)を有する対象。
クラスは鋳型で、インスタンスはクラスから生成される鋳物です。複数のインスタンスをクラスから生成することができます。
オブジェクト指向プログラミングは、以下の場合に用いられます。
- 変数を複数の関数で共有する場合
- 状態遷移や状態に依存する関数を記述する場合
- 2種類の変数に依存する関数を、引数とメンバー変数の関数として表現する場合
注)クラスは、変数や関数を分類するための一種の名前空間です。
注)クラスとインスタンスを総称してオブジェクト(object)と呼ぶことがあります。
注)C++ではメンバー変数(member variable)が、Javaではフィールド(field)が、オブジェクトの状態を表します。
注)手続き型プログラミングは、プログラムの中に頻繁に現れるステートメント(statement)の集まり(手続き)をサブルーチン(subroutine)として再利用するプログラミング技法のことです。
注)オブジェクト指向プログラミングは、関連する変数と手続き(procedure)の集まりをオブジェクト(object)として再利用するプログラミング技法のことです。
以下の例のように、C言語でグローバル変数や参照渡しを使ったプログラムは、オブジェクト指向プログラミングで書き換えることができます。
C言語によるオブジェクト指向風プログラミング(複数のインスタンスを生成できない)
robot.h
#pragma once
//extern double x, y;
extern void setRobot(double, double);
extern void moveRobot(double, double);
extern void printRobot(void);
robot.c
#include <stdio.h>
static double x, y;
void setRobot(double x0, double y0) {
x = x0;
y = y0;
}
void moveRobot(double dx, double dy) {
x += dx;
y += dy;
}
void printRobot(void) {
printf("x = %f\n", x);
printf("y = %f\n", y);
}
main.c
#include "robot.h"
int main(void) {
setRobot(0, 0);
moveRobot(1, 1);
printRobot();
}
C言語によるオブジェクト指向風プログラミング(複数のインスタンスを生成できる)
robot.h
#pragma once
typedef struct {
double x, y;
} Robot;
extern void setRobot(Robot*, double, double);
extern void moveRobot(Robot*, double, double);
extern void printRobot(Robot*);
robot.c
#include "robot.h"
#include <stdio.h>
void setRobot(Robot* robotp, double x, double y) {
robotp->x = x;
robotp->y = y;
}
void moveRobot(Robot* robotp, double dx, double dy) {
robotp->x += dx;
robotp->y += dy;
}
void printRobot(Robot* robotp) {
printf("x = %f\n", robotp->x);
printf("y = %f\n", robotp->y);
}
main.c
#include "robot.h"
int main(void) {
Robot robot1;
setRobot(&robot1, 0, 0);
moveRobot(&robot1, 1, 1);
printRobot(&robot1);
Robot robot2;
setRobot(&robot2, 0, 0);
moveRobot(&robot2, 2, 2);
printRobot(&robot2);
}
Javaによるオブジェクト指向プログラミング
robot.java
class Robot {
double x, y;
void set(double x, double y) {
this.x = x;
this.y = y;
}
void move(double dx, double dy) {
x += dx;
y += dy;
}
void print() {
System.out.println("x = " + x);
System.out.println("y = " + y);
}
}
main.java
class Main {
public static void main(String... args) {
Robot robot1 = new Robot();
robot1.set(0, 0);
robot1.move(1, 1);
robot1.print();
Robot robot2 = new Robot();
robot2.set(0, 0);
robot2.move(2, 2);
robot2.print();
}
}
参考サイト