C++のis-aとhas-a関係(オブジェクト指向的な関係)について説明。is-aは継承に、has-aはカプセル化に関連しているというところまで、簡単なサンプルコードを用いりながら説明しています。
なお、基礎知識や関連情報として以下のような内容がありますので、はじめに紹介しておきます。
C++のis-aまたはhas-a関係は、以下のとおりです。
継承関係 …サブクラス is a スーパクラス。
包含関係 …全体クラス has a 部分クラス。
このページでは、C++のis-aまたはhas-a関係(オブジェクト指向的な関係)について説明しています。 以下では、簡単なサンプルコードを用いりながらis-a関係とhas-a関係について説明しています。
以下のようなサンプルコードを考えました。 これを使用して説明します。
class Num {
:
}
class NumAndChar : public Num {
:
}
class Couter {
private:
NumAndChar numAndChar;
:
};
:
1つのアプリケーションを構成するクラス間にはis-aとhas-aの2種類の関係が存在します。
1つは、サンプルコードのNumクラスからNumAndCharクラスを派生というクラス間の関係(is-a:継承関係)で、 もう1つは、CouterクラスでのNumAndCharクラスの参照というクラス間の関係(has-a:包含関係)です。
概要のサンプルコードを少し具体化しました。 これを使用して説明します。
class Num {
private:
int n;
public:
void setNum(int value);
void showNum();
};
class NumAndChar : public Num {
private:
char c;
public:
void setChar(char value);
void showChar();
};
is-a関係とは継承に起因して発生するものです。 サンプルのように、NumクラスからNumAndCharクラスを派生というクラス間の関係(継承関係)です。
上位となる抽象的なクラスをスーパークラスといい、下位の具体的なクラスをサブクラスといいます。 サブクラスは、スーパクラスの機能を原則として受け継ぎスーパクラスの機能も持ち合わせます。 これを継承といい、継承することでスーパクラスの機能をサブクラスで記述しなくて済みます。
例えば、NumAndCharクラスをはじめにつくって、汎用的な性質をまとめてNumクラスを作ることを汎化といいます。 トラック、バス⇒自動車というように複数のクラスに共通する抽象的な性質を別のクラスにするイメージです。
また、作成したNumクラスからNumAndCharクラスを作ることを特化といいます。 自動車⇒トラック、バスというように、抽象的なクラスからもっと具体的なクラスを考えるイメージです。
トラックは自動車である(Track is a car)と言え、この汎化と特化の関係をis-a関係といいます。
is-a関係のサンプルコードをさらに具体化しました。 これを使用して説明します。
class C {
class Num {
private:
int n;
public:
void setNum(int value);
void showNum();
};
class NumAndChar : public Num {
private:
char c;
public:
void setChar(char value);
void showChar();
};
class Couter {
private:
NumAndChar numAndChar;
public:
void setNumAndChar(NumAndChar value);
void showNumAndChar();
};
has-a関係とは、クラスという1つの構造体の中に複数のデータやメソッドをまとめて格納します。 サンプルのようにCouterクラスでのNumAndCharクラスの参照というクラス間の関係(包含関係)です。
データとメソッドをまとめることは、データを保護して、モジュールの独立性を高めるのに役立ちます。 これをオブジェクトの情報隠蔽(カプセル化)といいます。
例のようにCouterクラスの属性にNumAndCharクラスがあるように包含関係は、全体と部分の関係をいいます。 たとえば、自動車はハンドルやタイヤをもっているように、 あるクラスが別のクラスをデータ(属性)としてもっているという関係をいいます。
ハンドルは自動車の一部である(The handle is a part of a motor vehicle)、 自動車はハンドルをもっている(Car has a handle)と言え、この包含関係をhas-a関係といいます。
せっかくなのでサンプルコードを動かせるところまで実装して、動かしてみます。
#include <iostream>
using namespace std;
class Num {
private:
int n;
public:
void setNum(int value);
void showNum();
};
class NumAndChar : public Num {
private:
char c;
public:
void setChar(char value);
void showChar();
};
class Couter {
private:
NumAndChar numAndChar;
public:
void setNumAndChar(NumAndChar value);
void showNumAndChar();
};
void Num::setNum(int value) {
n = value;
}
void Num::showNum() {
cout << "num=" << n << "\n";
}
void NumAndChar::setChar(char value) {
c = value;
}
void NumAndChar::showChar() {
cout << "char=" << c << "\n";
}
void Couter::setNumAndChar(NumAndChar value) {
numAndChar = value;
}
void Couter::showNumAndChar() {
numAndChar.showNum();
numAndChar.showChar();
}
int main() {
NumAndChar numAndChar;
numAndChar.setNum(1);
numAndChar.setChar('A');
Couter couter;
couter.setNumAndChar(numAndChar);
couter.showNumAndChar();
}
今回は、Borland C++ Compilerを使用してコンパイルしました。
ソースファイルをSample.cppと保存したフォルダにコマンドプロンプトで移動しbcc32コマンドを実行してコンパイルします。
>cd <保存したフォルダ>
>bcc32 Sample.cpp
Sample.exeというファイルができたフォルダにコマンドプロンプトで移動し、Sampleとコマンドラインに入力する以下のように出力されます。
>Sample
num=1
char=A
スポンサーリンク
サイト内のページ
言語
C・C++
/HTML
/Java
/JavaScript
/PHP
/シェルスクリプト
開発環境
Ant
/Burp
/Eclipse
/Fiddler
/gcc
/gdb
/Git
/g++
/JDK
/JMeter
/JUnit
/Teraterm
/ZAP
技術・仕様
Ajax
/CORBA
/Jakarta EE(旧称J2EE、Java EE)
/JNI
ライブラリ/Framework/CMS
bootstrap
/jQuery
/FuelPHP
/Lucene
/MyBatis
/Seasar2
/Spring
/Struts
/WordPress
Web API
Google Maps
ITインフラOSとミドルウェア
Linux
/Windows
/シェル
ActiveMQ
/Tomcat
/MariaDB
/MySQL
/Nagios
/Redis
/Solr
ITインフラセキュリティ
公開サーバーのセキュリティ
SI
ホームページの作り方
スポンサーリンク
関連サイト内検索ツール
zealseedsおよび関連サイト内のページが検索できます。
IPアドレス確認ツール
あなたのグローバルIPアドレスは以下です。
13.59.139.202
HTMLの表示色確認ツール
パスワード生成ツール
文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。
ここに生成されます。
スポンサーリンク
Copyright (C) 2007-2024 zealseeds. All Rights Reserved. Loarding…