SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

突然ですがクイズです!(AD)

突然ですがクイズです!-その1

Delphi、C++、Java、C#、PHP、Rubyの6言語の動作の違いをクイズで考察

  • X ポスト
  • このエントリーをはてなブックマークに追加

文字列で出力

問題

 次は、インスタンスを文字列として表現して出力する場合です。この中でも1つだけ出力結果が違うものがあります。それは、どの言語でしょうか?

Delphi
program Project1;
{$APPTYPE CONSOLE}

type
  TMyClass = record
    class operator Explicit(x: TMyClass): string;
  end;

class operator TMyClass.Explicit(x: TMyClass): string;
begin
  Result := ’TMyClass’;
end;

var
  obj: TMyClass;
begin
  Writeln(string(obj));
end.
C++
#include <iostream>
using namespace std;

class TMyClass {
  friend ostream& operator <<(ostream& os, const TMyClass& obj) {
    os << "TMyClass";
    return os;
  }
};

int main(int argc, char* argv[])
{
  cout << TMyClass() << endl;
  return 0;
}
Java
package project1;

class TMyClass {
  public String toString() {
    return "TMyClass";
  }
}

public class Project1 {
  public static void main(String[] args) {
    System.out.println(new TMyClass());
  }
}
C#
namespace project1 {
class TMyClass {
  public string toString() {
    return "TMyClass";
  }
}

public class Project1 {
  public static void Main() {
    System.Console.WriteLine(new TMyClass());
  }
}
}
PHP5
<?php
class TMyClass {
  public function __toString() {
    return "TMyClass";
  }
}

echo (string)new TMyClass() . "\n";
?>
Ruby
class TMyClass
  def to_s
    "TMyClass"
  end
end

puts TMyClass.new
解説

 正解は「C#」。

 C#では、期待した「TMyClass」ではなく「project1.TMyClass」が出力されます。それ以外の言語では正しく「TMyClass」が出力されます。これは一体どうしたというのでしょう。

 Delphi(record型のみ)では明示的なキャストが可能ですし、C++では演算子オーバーロードを定義することが可能です。JavaではtoString()メソッドを、PHPでは__toString()メソッドを、Rubyではto_sメソッドをオーバーライドすることにより、文字列としての表現方法を独自に実装することが可能です。もちろんC#でも「ObjectクラスのToString()メソッド」をオーバーライドすることで同様の処理が可能です。

 しかし問題のコードでは、オーバーライドが正しく行われていません。コンパイル時には警告もエラーも発生しませんでした。C#ではメソッドの大文字・小文字を区別しますし、メソッドのオーバーライドにはoverride修飾子が必要なのです。

 このため「ObjectクラスのToString()メソッド」が呼び出され、その既定の実装である「クラスの完全限定名」が文字列として返されたのです。正しくは以下のように記述します。

class TMyClass {
  public override string ToString() {
    return "TMyClass";
  }
}

次のページ
メソッドのオーバーライド

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
突然ですがクイズです!連載記事一覧
この記事の著者

EDN編集部(イーディーエヌ編集部)

エンバカデロ・デベロッパーネットワーク(EDN)は、ソフトウェア開発者とデータベース技術者のための技術情報サイトです。Delphi、C++Builderをはじめとする開発ツールやER/Studioなどのデータベースツールに関連する技術記事、ビデオなどを提供しています。EDN編集部は、EDN記事と連携...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2289 2008/08/20 13:35

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング