2007/06/27(水)リフレクション

リフレクションを利用したオブジェクトの複製の例.
実行時にオブジェクトのメタデータからコンストラクタを取得しています.

using namespace System;

class hoge;
class huga: public hoge;
class piyo: public hoge;

int main()
{
  hoge ^obj;
  hoge ^obj2;

  Type ^type;
  ConstructorInfo^ constructorInfoObj;

  obj = gcnew huga();
  type = obj->GetType(); // 型情報(メタデータ)の取得
  constructorInfoObj = type->GetConstructor(System::Type::EmptyTypes); // 引数無しのコンストラクタの取得
  obj = (hoge^)constructorInfoObj->Invoke(nullptr); // 引数無しでコンストラクタを呼び出す

  // ここで obj は huga のオブジェクトになってる

  obj = gcnew piyo();
  type = obj->GetType(); // 型情報(メタデータ)の取得
  constructorInfoObj = type->GetConstructor(System::Type::EmptyTypes); // 引数無しのコンストラクタの取得
  obj = (hoge^)constructorInfoObj->Invoke(nullptr); // 引数無しでコンストラクタを呼び出す

  // ここで obj は piyo のオブジェクトになってる

  return 0;
}

2007/06/02(土)3日

プログラムを作り始めて早3日.
.NETの方言にも少しずつ慣れてきました.

で,思ったこと.
以前のシンプルだったC言語はどこへ行った...

良きに計らいすぎ

なにがどうなっているのやらさっぱり.関数呼び出しなのか,変数への代入なのか.
確かにプロパティは便利なんだけど,ゲッター,セッターを定義する場合,プロパティ名とは別に変数が必要になるし.プロパティ名と同名の変数が使えれば管理が楽なのに.

文法も機能も複雑化.

ガベージコレクションを使うために以前は__gcで修飾してたけど,2005から(?)は^とか%とかrefとかいろいろ増えた.

ヘッダ至上主義?

実行ファイルの最適化の為なのか,ヘッダファイルでほとんど済ませてしまう.
cppファイルはヘッダファイルをコンパイルする為のものに成り下がってます.

増えた機能は使わなくてもプログラムは書けるのでCLIを意識しなければいいんだろうけど,それだとwindowsプログラムが書けなくなる.
個人的には純粋なC++程度が一番使いやすかった.独自拡張で機能を増やすのもいいけれど,そのせいで覚えにくくなるのも困る.

以前はC言語覚えれば他の言語に応用できると言ってたけど,オブジェクト指向の流行を考えると素直にJavaやっておいたほうがいいかもしれませんね.