マルチステートタイプ

1388 ワード

インタフェースの様々な異なる実装方式は、マルチステートである.一般的には、1つのタイプは複数のタイプの操作に対応することができます.
C/C++にはポインタ、union、テンプレート、void*のマルチステートタイプがあります.マルチステートタイプは、インタフェースとしてデータ保護と非表示の効果があります.
 
ポインタ:
継承関係を持つクラスでは、親オブジェクトポインタに子オブジェクトアドレスを割り当てることで、親オブジェクトポインタは現在割り当てられている子オブジェクトの特性に応じて異なる方法で実行できます.C++ではポインタを用いてオブジェクト言語向けの重要な特性「マルチステート」を実現した.
関数ポインタ:
コールバック関数を関数ポインタに登録すると、関数ポインタは、割り当てられたコールバック関数に基づいて異なる方法で実行できます.linuxでは,関数ポインタによりファイルシステムの対外インタフェースを実現した.
 
かたわく
関数またはクラスは、テンプレートによって同じ方法で実行される複数の異なるタイプ(基本タイプ、カスタムタイプ)を実装します.STL(標準テンプレートライブラリ)言語サポートメカニズムがテンプレートです.
 
void *:
任意のタイプのポインタはvoid*に直接割り当てることができます.void*は、任意のタイプのポインタに強く変換することもできます.関数操作の未知のタイプのデータに使用されます.
 
union:
Union内のすべてのデータ・メンバーは1つの空間(最大データ・メンバーの空間)を共有し、同じ時間に1つのデータ・メンバーしか格納できません.すべてのデータ・メンバーには、同じ開始アドレスがあります.
 
普段はunionが少ないので、インタフェースの例としてunionを挙げます.
 
#include <iostream.h>

struct messageRequest1

{

  int msgId;

  int a;

  int b;

  int c;

};

struct messageRequest2

{

  int msgId;

  char a;

  char b;

  char c;

};

union SIGNAL

{

  int msgId;

  messageRequest1 msgreq1;

  messageRequest2 msgreq2;

  //msg3

  //msg4

};

int main()

{

  SIGNAL sig;

  sig.msgreq2.msgId = 2;

  

//   union                 ,    union    msgId              msg,                

  cout<<sig.msgId<<endl;

  return 1;

}