データ型とポリモーフィズム

何がオブジェクトか? 「第1回:オブジェクト指向、再考」では、オブジェクトについて、概念的な説明を試み、C++による簡単な定義例で雰囲気をつかんでもらいました。ただ、オブジェクト指向には実にいろいろな考え方があり、「○○は△△だ」とすっきり断言できない事情があります。

荻原 剛志

2008年11月13日 20:00

何がオブジェクトか?

 「第1回:オブジェクト指向、再考」では、オブジェクトについて、概念的な説明を試み、C++による簡単な定義例で雰囲気をつかんでもらいました。ただ、オブジェクト指向には実にいろいろな考え方があり、「○○は△△だ」とすっきり断言できない事情があります。

 オブジェクト指向の世界の大御所的な存在に「Smalltalk」があります。Smalltalkは1980年代のオブジェクト指向ムーブメントのきっかけを作った言語システムであり、現在もVisualWorksやSqueakなどの多くの環境で触れることができます。このSmalltalkでは、整数や真偽値、条件分岐や繰り返しに用いるブロックまで、ほぼあらゆるものがオブジェクトです。

 最近人気の高いRubyは国産のオブジェクト指向言語で、その対抗馬としてよく比較される言語にPython(パイソン)があります。これらはインタプリタで動作するスクリプト言語ですが、これらの言語でも整数などのデータ型はオブジェクトとされています。

 C++やObjective-Cでは、整数などのデータはオブジェクトではありません。JavaやC#でも、整数などの基本データ型はオブジェクトではありませんが、オブジェクトとして扱えた方が便利な場合が多いので、基本データとオブジェクトの間で変換を行えるようになっています。これをボクシングとアンボクシング、文脈によって自動的に変換を行う機能をオートボクシングと呼びます。

 つまり、言語の美しさや統一感、プログラムのしやすさを第一に考えると、どれもこれもオブジェクトである方が扱いやすいわけですが、実際の処理効率やデータ表現といったことを考えると、少なくとも基本データ型はマシン表現に近い方がいいということになるわけです。

 配列に関する取り扱いもまたさまざまです。C言語風の考え方もあれば、大きさ(容量)を動的に変化できる配列もあります。配列がオブジェクトとして扱われる言語も、そうでない言語もあります。

 さらに、クラスをオブジェクトとみなす言語もあります。SmalltalkやObjective-Cでは実行中のメモリ内に、オブジェクトとして動作するクラスが実体として存在し、これをクラスオブジェクトと呼びます。クラスオブジェクトは、クラスに属するインスタンスに共通する属性の操作や、インスタンスの作り方に動的にかかわることができます。クラスオブジェクトの話題は実は奥が深いのでこの辺で切り上げておきます。

メッセージはどうやって送るのか

 オブジェクト指向言語では一般に、あるオブジェクトのメソッドを起動する動作を「メッセージを送る」と言います。ただ、C++では「メンバ関数を呼び出す」という言い方を使うようです。図1に、いくつかの言語のメッセージの送り方を示します。BirthdayというクラスのメソッドsetDateを呼び出しますが、このメソッドには引数が2つあるとします。

 まず(1)はC++です。(2)はJavaで、newの関数名の後のカッコは、コンストラクタの呼び出しに引数がないことを表しています。(3)はRubyです。ここまではオブジェクトの後にピリオド、メソッド名を書くグループです。図にはありませんが、C#も同じです。

 (4)はSmalltalkです。縦棒の間に名前を書いて、変数であることを示します。オブジェクトの後に空白を置いて、メッセージ名を書きます。メソッド名をちょっと変えて、setMonth:day:としています。引数がある部分をコロン「:」で示します。

 (5)はObjective-Cですが、この言語はSmalltalkからいろいろな要素を受け継いでおり、メッセージの送り方も似ています。メッセージ送信はカギ括弧で囲んだ中に、受け手のオブジェクトとメッセージ名、引数を書き、全体は式となります。引数が複数個ある場合、何番目の引数が何を意味するのか忘れてしまうことがよくありますが、(4)、(5)の流儀では引数の意味がはっきりするので助かります。読みやすいかどうかは好みが分かれるかもしれません。

 また、x.add(y)と書く代わりに、演算子がメソッドの呼び出しを表すように定義することでx + yのように記述できる言語もあります。これを演算子のオーバーローディングと呼びます。C++、Smalltalk、Rubyではそのような定義が可能です。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30