プログラミング言語の比較 > クラスとインスタンス

値を変更できる(mutable)人物クラス

名前と年齢を保持するクラスを定義して、インスタンス化し、名前と年齢をセットして文字列に変換する。

Java

  1. class Person {
  2.     private String name;
  3.     private int age;
  4.     public String getName() { return name; }
  5.     public void setName(String name) { this.name = name; }
  6.     public int getAge() { return age; }
  7.     public void setAge(int age) { this.age = age; }
  8.     @Override
  9.     public String toString() {
  10.         return String.format("%s (%d years old)", name, age);
  11.     }
  12. }
  1. Person p = new Person();
  2. p.setName("Taro");
  3. p.setAge(20);
  4. String s = p.toString();

Groovy

  1. class Person {
  2.     String name
  3.     int age
  4.     @Override String toString() { "${name} (${age} years old)" }
  5. }
  1. def p = new Person(name: 'Taro', age: 20)
  2. def s = p.toString()

Scala

  1. class Person {
  2.     var name: String = _
  3.     var age: Int = _
  4.     override def toString = "%s (%d years old)".format(name, age)
  5. }
  1. class Person(var name: String, var age: Int) {
  2.     def this() = this(null0)
  3.     override def toString = "%s (%d years old)".format(name, age)
  4. }
  1. var p = new Person
  2. p.name = "Taro"
  3. p.age = 20
  4. var s = p.toString

F#

  1. type Person() =
  2.     let mutable name = ""
  3.     let mutable age = 0
  4.     member this.Name with get() = name and set value = name <- value
  5.     member this.Age  with get() = age  and set value = age  <- value
  6.     override this.ToString() = sprintf "%s (%d years old)" name age
  1. type Person =
  2.     val mutable name : string
  3.     val mutable age : int
  4.     new() = { name = ""; age = 0 }
  5.     member this.Name with get() = this.name and set value = this.name <- value
  6.     member this.Age  with get() = this.age  and set value = this.age  <- value
  7.     override this.ToString() = sprintf "%s (%d years old)" this.name this.age
  1. let p = new Person(Name = "Taro", Age = 20)
  2. let s = p.ToString()
  1. let p = new Person()
  2. p.Name <- "Taro"
  3. p.Age <- 20
  4. let s = p.ToString()
F# 3.0以降
  1. type Person() =
  2.     member val Name = "" with get, set
  3.     member val Age  = 0  with get, set
  4.     override this.ToString() = sprintf "%s (%d years old)" this.Name this.Age

C#

C# 3.0以降
  1. class Person {
  2.     public string Name { getset; }
  3.     public int Age { getset; }
  4.     public override string ToString() {
  5.         return string.Format("{0} ({1} years old)", Name, Age);
  6.     }
  7. }
  1. var p = new Person { Name = "Taro", Age = 20 };
  2. string s = p.ToString();
C# 2.0まで
  1. class Person {
  2.     private string name;
  3.     private int age;
  4.     public string Name {
  5.         get { return name; }
  6.         set { name = value; }
  7.     }
  8.     public int Age {
  9.         get { return age; }
  10.         set { age = value; }
  11.     }
  12.     public override string ToString() {
  13.         return string.Format("{0} ({1} years old)", name, age);
  14.     }
  15. }
  1. Person p = new Person();
  2. p.Name = "Taro";
  3. p.Age = 20;
  4. string s = p.ToString();

C++

  1. #include <strstream>
  2. class person {
  3. public:
  4.     string name;
  5.     int age;
  6.     operator string();
  7. };
  8. // person クラスから文字列への変換関数
  9. person::operator string() {
  10.     strstream ss;
  11.     ss << name << " (" << age << " years old)";
  12.     return ss.str();
  13. }
  1. person p;
  2. p.name = "Taro";
  3. p.age = 20;
  4. string s = p;
  1. person p;
  2. p.name = "Taro";
  3. p.age = 20;
  4. string s = static_cast<string>(p);

Go

  1. type Person struct {
  2.     Name string
  3.     Age int
  4. }
  5. func (this *Person) String() string {
  6.     return fmt.Sprintf("%s (%d years old)", this.Name, this.Age)
  7. }
  1. p := Person{"Taro"20}
  2. s := p.String()
  1. p := Person{Name: "Taro", Age: 20}
  2. s := p.String()
  1. var p Person
  2. p.Name = "Taro"
  3. p.Age = 20
  4. s := p.String()

Dart

  1. class Person {
  2.     String _name;
  3.     int _age;
  4.     String get name() => _name;
  5.     void   set name(String name) { _name = name; }
  6.     int  get age() => _age;
  7.     void set age(int age) { _age = age; }
  8.     String toString() => '$name ($age years old)';
  9. }
  1. var p = new Person();
  2. p.name = 'Taro';
  3. p.age = 20;
  4. String s = p.toString();

ActionScript

  1. class Person {
  2.     private var _name:String;
  3.     private var _age:int;
  4.     public function get name():String { return _name; }
  5.     public function set name(name:String):void { _name = name; }
  6.     public function get age():int { return _age; }
  7.     public function set age(age:int):void { _age = age; }
  8.     public function toString():String {
  9.         return StringUtil.substitute('{0} ({1} years old)', _name, _age);
  10.     }
  11. }
  1. var p:Person = new Person();
  2. p.name = "Taro";
  3. p.age = 20;
  4. var s:String = p.toString();

JavaScript

  1. function Person(name, age) {
  2.     this.name = name;
  3.     this.age = age;
  4.     this.toString = function() {
  5.         return this.name + ' (' + this.age + ' years old)';
  6.     };
  7. }
  1. var p = new Person('Taro'20);
  2. var s = String(p);

CoffeeScript

  1. class Person
  2.     constructor: (@name, @age) ->
  3.     toString: -> "#{@name} (#{@age} years old)"
  1. p = new Person 'Taro'20
  2. s = String p

Lua

  1. Person = {}
  2. function Person:new(name, age)
  3.     local t = { name=name, age=age }
  4.     local meta = {
  5.         __tostring = function(self) return string.format('%s (%d years old)', self.name, self.age) end
  6.     }
  7.     return setmetatable(t, meta)
  8. end
  1. p = Person:new('Taro'20)
  2. s = tostring(p)

Ruby

  1. class Person
  2.   attr_accessor :name:age
  3.   def to_s
  4.     "#{name} (#{age} years old)"
  5.   end
  6. end
  1. p = Person.new
  2. p.name = 'Taro'
  3. p.age = 20
  4. s = p.to_s

Python

  1. class Person:
  2.     name = None             # 省略可
  3.     age = None              # 省略可
  4.     def __str__(self):
  5.         return '%s (%d years old)' % (self.name, self.age)
  1. p = Person()
  2. p.name = 'Taro'
  3. p.age = 20
  4. s = str(p)

PHP

  1. class Person {
  2.     public $name;           // 省略可
  3.     public $age;            // 省略可
  4.     public function __toString() {
  5.         return "{$this->name} ({$this->age} years old)";
  6.     }
  7. }
  1. $p = new Person();
  2. $p->name = 'Taro';
  3. $p->age = 20;
  4. $s = (string)$p;

Perl

  1. package Person;
  2. use overload q/""/ => sub {                             # 文字列への変換関数
  3.     my $self = shift;
  4.     "$self->{name} ($self->{age} years old)";
  5. };
  6. sub new {
  7.     my $class = shift;
  8.     bless {}, $class;
  9. }
  1. # use Person;
  2. my $p = Person->new;
  3. $p->{name} = 'Taro';
  4. $p->{age} = 20;
  5. my $s = "$p";
CPAN の Class::Accessor::Lvalue を使った場合
  1. package Person;
  2. use base qw/Class::Accessor::Lvalue::Fast/;
  3. use overload q/""/ => sub {                             # 文字列への変換関数
  4.     my $self = shift;
  5.     "$self->{name} ($self->{age} years old)";
  6. };
  7. __PACKAGE__->mk_accessors(qw/name age/);                # ゲッター・セッターを作る
  1. # use Person;
  2. my $p = Person->new;
  3. $p->name = 'Taro';
  4. $p->age = 20;
  5. my $s = "$p";
CPAN の Class::MethodMaker を使った場合
  1. package Person;
  2. use overload q/""/ => sub {                             # 文字列への変換関数
  3.     my $self = shift;
  4.     "$self->{name} ($self->{age} years old)";
  5. };
  6. use Class::MethodMaker [
  7.     new => [qw/new/],                                   # コンストラクタを作る
  8.     scalar => [qw/name age/],                           # ゲッター・セッターを作る
  9. ];
  1. # use Person;
  2. my $p = Person->new;
  3. $p->name('Taro');
  4. $p->age(20);
  5. my $s = "$p";

値を変更できない(immutable)人物クラス

インスタンス化の際に引数で名前と年齢を指定し、その後それらの値を読み出す。

Java

  1. class Person {
  2.     private final String name;
  3.     private final int age;
  4.     public Person(String name, int age) {
  5.         this.name = name;
  6.         this.age = age;
  7.     }
  8.     public String getName() { return name; }
  9.     public int getAge() { return age; }
  10. }
  1. Person p = new Person("Taro"20);
  2. String name = p.getName();
  3. int age = p.getAge();

Groovy

  1. class Person {
  2.     private final name
  3.     private final age
  4.     public Person(name, age) {
  5.         this.name = name
  6.         this.age = age
  7.     }
  8.     String getName() { name }
  9.     int getAge() { age }
  10. }
  1. def p = new Person("Taro"20)
  2. def name = p.name
  3. def age = p.age

Scala

  1. class Person(val name: String, val age: Int)
  1. val p = new Person("Taro"20)
  2. val name = p.name
  3. val age = p.age

Haskell

  1. data Person = Person {name :: String, age :: Integer}
  2. instance Show Person where
  3.     show = \ p -> (name p) ++ " (" ++ (show $ age p) ++ " years old)"
  1. let p = Person "Taro" 20
  2. let name' = name p
  3. let age' = age p

F#

  1. type Person(name : string, age : int) =
  2.     member this.Name = name
  3.     member this.Age = age
  1. type Person =
  2.     val private name : string
  3.     val private age : int
  4.     new(name, age) = { name = name; age = age }             // 「name = name」の左側はフィールド名、右側はこのコンストラクタの引数名
  5.     member this.Name = this.name
  6.     member this.Age = this.age
  1. let p = new Person("Taro"20)
  2. let name = p.Name
  3. let age = p.Age
F# 3.0以降
  1. type Person(name : string, age: int) =
  2.     member val Name = name with get
  3.     member val Age  = age  with get

C#

C# 3.0以降
  1. class Person {
  2.     public string Name { getprivate set; }
  3.     public int Age { getprivate set; }
  4.     public Person(string name, int age) {
  5.         Name = name;
  6.         Age = age;
  7.     }
  8. }
  1. var p = new Person("Taro"20);
  2. string name = p.Name;
  3. int age = p.Age;
C# 2.0まで
  1. class Person {
  2.     private string name;
  3.     private int age;
  4.     public string Name {
  5.         get { return name; }
  6.     }
  7.     public int Age {
  8.         get { return age; }
  9.     }
  10.     public Person(string name, int age) {
  11.         this.name = name;
  12.         this.age = age;
  13.     }
  14. }
  1. Person p = new Person("Taro"20);
  2. string name = p.Name;
  3. int age = p.Age;

C++

  1. class person {
  2. public:
  3.     person(const string name, const int age) : _name(name), _age(age) {}
  4.     string name() const { return _name; }
  5.     int age() const { return _age; }
  6. private:
  7.     const string _name;
  8.     const int _age;
  9. };
  1. person p("Taro"20);
  2. string name = p.name();
  3. int age = p.age();
  1. person* p = new person("Taro"20);
  2. string name = p->name();
  3. int age = p->age();
  4. delete p;

Go

  1. type Person struct {
  2.     name string                             // 小文字で始まるフィールドは private になるので外から見えない
  3.     age int
  4. }
  5. func (this *Person) Name() string {         // public なゲッター
  6.     return this.name
  7. }
  8. func (this *Person) Age() int {
  9.     return this.age
  10. }
  1. p := Person{"Taro"20}
  2. name := p.Name()
  3. age := p.Age()
  1. p := Person{name: "Taro", age: 20}
  2. name := p.Name()
  3. age := p.Age()

Dart

  1. class Person {
  2.     final String _name;
  3.     final int _age;
  4.     String get name() => _name;
  5.     int get age() => _age;
  6.     Person(this._name, this._age);
  7. }
  1. var p = new Person('Taro'20);
  2. String name = p.name;
  3. int age = p.age;

ActionScript

  1. class Person {
  2.     private var _name:String;
  3.     private var _age:int;
  4.     public function get name():String { return _name; }
  5.     public function get age():int { return _age; }
  6.     public function Person(name:String, age:int) {
  7.         this._name = name;
  8.         this._age = age;
  9.     }
  10. }
  1. var p:Person = new Person('Taro'20);
  2. var name:String = p.name;
  3. var age:int = p.age;

JavaScript

JavaScript 1.8.5(Firefox 4.0)以降
  1. function Person(name, age) {
  2.     Object.defineProperty(this'name', {value: name});
  3.     Object.defineProperty(this'age',  {value: age});
  4. }
  1. var p = new Person('Taro'20);
  2. var name = p.name;
  3. var age = p.age;

CoffeeScript

JavaScript 1.8.5(Firefox 4.0)以降
  1. class Person
  2.     constructor: (name, age) ->
  3.         Object.defineProperty @, 'name', value: name
  4.         Object.defineProperty @, 'age',  value: age
  1. p = new Person 'Taro'20
  2. name = p.name
  3. age = p.age

Ruby

  1. class Person
  2.   attr_reader :name:age
  3.   def initialize name, age
  4.     @name = name
  5.     @age = age
  6.   end
  7. end
  1. p = Person.new 'Taro'20
  2. name = p.name
  3. age = p.age

Python

  1. class Person:
  2.     def __init__(self, name, age):
  3.         self.__name = name
  4.         self.__age = age
  5.     def name(self): return self.__name
  6.     def age(self): return self.__age
  1. p = Person('Taro'20)
  2. name = p.name()
  3. age = p.age()

PHP

  1. class Person {
  2.     private $_name;
  3.     private $_age;
  4.     public function __construct($name$age) {
  5.         $this->_name = $name;
  6.         $this->_age = $age;
  7.     }
  8.     public function name() {
  9.         return $this->_name;
  10.     }
  11.     public function age() {
  12.         return $this->_age;
  13.     }
  14. }
  1. $p = new Person('Taro'20);
  2. $name = $p->name();
  3. $age = $p->age();

Perl

  1. package Person;
  2. sub new {
  3.     my $class = shift;
  4.     my $self;
  5.     $self->{$_} = shift for qw/name age/;
  6.     bless $self$class;
  7. }
  8. sub name {
  9.     shift->{name};
  10. }
  11. sub age {
  12.     shift->{age};
  13. }
  1. # use Person;
  2. my $p = Person->new('Taro'20);
  3. my $name = $p->name;
  4. my $age = $p->age;
CPAN の Class::Accessor::Lvalue を使った場合
  1. package Person;
  2. use base qw/Class::Accessor::Lvalue::Fast/;
  3. our @keys = qw/name age/;
  4. __PACKAGE__->mk_ro_accessors(@keys);                # ゲッターを作る
  5. sub new {
  6.     my $class = shift;
  7.     my $self = $class->SUPER::new;                  # コンストラクタをオーバーライドする
  8.     $self->{$_} = shift for @keys;
  9.     $self;
  10. }
  1. # use Person;
  2. my $p = Person->new('Taro'20);
  3. my $name = $p->name;
  4. my $age = $p->age;

クラス名の文字列を元にインスタンスを生成する

Java

  1. String className = "Person";
  2. Object p = Class.forName(className).getConstructors()[0].newInstance("Taro"20);

Groovy

  1. def className = 'Person'
  2. def p = Class.forName(className).newInstance('Taro'20)

Scala

  1. val className = "Person"
  2. val p = Class.forName(className).getConstructors()(0).newInstance("Taro"20.asInstanceOf[AnyRef])
  1. val className = "Person"
  2. val args = List("Taro"20).map(_.asInstanceOf[AnyRef]).toArray
  3. val p = Class.forName(className).getConstructors()(0).newInstance(args: _*)

F#

  1. let className = "Person"
  2. let p = System.Type.GetType(className).GetConstructors().[0].Invoke [|"Taro"20|]

C#

  1. string className = "Person";
  2. object p = Type.GetType(className).GetConstructors()[0].Invoke(new object[] { "Taro"20 });

JavaScript

  1. var className = 'Person';
  2. var p = new (eval(className))('Taro'20);

CoffeeScript

  1. className = 'Person'
  2. p = new (eval className) 'Taro'20

Ruby

  1. class_name = 'Person'
  2. p = eval(class_name).new('Taro'20)

Python

  1. class_name = 'Person'
  2. p = eval(class_name)('Taro'20)

PHP

  1. $className = 'Person';
  2. $p = new $className('Taro'20);

Perl

  1. my $class_name = 'Person';
  2. my $p = $class_name->new('Taro'20);

文字列クラスの3世代親のクラスを取得する(なければ null)

Java

  1. Class<?> clazz = "".getClass();
  2. for (int i = 0; i < 3; i++) {
  3.     clazz = clazz.getSuperclass();
  4.     if (clazz == nullbreak;
  5. }

Groovy

  1. def clazz = ''.class
  2. 3.times { clazz = clazz?.superclass }

Scala

  1. var clazz = "".getClass
  2. (1 to 3).foreach(_ => if (clazz != null) clazz = clazz.getSuperclass)

F#

  1. let f (typ : Type) _ =
  2.     match typ with
  3.     | null -> null
  4.     | typ -> typ.BaseType
  5. let typ = Seq.fold f ("".GetType()) [1..3]
  1. let f = function
  2.         | null -> null
  3.         | (typ : Type) -> typ.BaseType
  4. let typ = Seq.fold (fun typ _ -> f typ) ("".GetType()) [1..3]
  1. let mutable typ = "".GetType()
  2. for i = 1 to 3 do
  3.     match typ with
  4.     | null -> ()
  5.     | t -> typ <- t.BaseType

C#

  1. Type type = "".GetType();
  2. for (int i = 0; i < 3; i++) {
  3.     type = type.BaseType;
  4.     if (type == nullbreak;
  5. }

Ruby

  1. clazz = ''.class
  2. 3.times { clazz = clazz.superclass unless clazz.nil? }

Python

文字列クラスが多重継承をしていない前提でなら
  1. # import inspect
  2. t = type('')
  3. try:
  4.     t = inspect.getmro(t)[3]
  5. except IndexError:
  6.     None

オブジェクトの内容(メンバー変数の名前と値)を文字列で表す

Java

Commons Lang 3.0以降を使った場合
  1. // import org.apache.commons.lang3.builder.ToStringBuilder;
  2. Object = ...            // 任意のオブジェクト
  3. String s = ToStringBuilder.reflectionToString(obj);

Groovy

  1. def obj = ...           // 任意のオブジェクト
  2. def s = obj.dump()

Scala

case class の場合。名前は含まれないが…
  1. val obj = ...           // case class のオブジェクト
  2. val s = obj.toString

Go

  1. obj := ...              // 任意の値
  2. s := fmt.Sprint(obj)

ActionScript

  1. var obj:Object = ...    // 任意のオブジェクト
  2. var s:String = ObjectUtil.toString(obj);

JavaScript

Node.js を使った場合
  1. // var util = require('util')
  2. var obj = ...
  3. var s = util.inspect(obj);

CoffeeScript

Node.js を使った場合
  1. # util = require 'util'
  2. obj = ...
  3. s = util.inspect obj

Ruby

  1. obj = ...               # 任意のオブジェクト
  2. s = obj.inspect

Python

  1. obj = ...               # 任意のオブジェクト
  2. s = repr(obj.__dict__)
もう少し見栄えを良くしたければ
  1. # import re
  2. obj = ...               # 任意のオブジェクト
  3. r = re.compile('^_.+__')
  4. s = ', '.join(r.sub('__', name) + ': ' + repr(value) for name, value in obj.__dict__.items())

PHP

  1. $obj = ...              // 任意のオブジェクト
  2. $s = var_export($obj, true);
もう少し見栄えを良くしたければ
  1. $obj = ...              // 任意のオブジェクト
  2. $vars = get_object_vars($obj);
  3. foreach ($vars as $name => &$value) {
  4.     $value = $name . ': ' . var_export($value, true);
  5. }
  6. $s = implode(', '$vars);

Perl

  1. # use Data::Dumper;
  2. my $obj = ...;          # 任意のオブジェクト
  3. my $s = Dumper($obj);

既存のクラスにメソッドを追加する

Groovy

メタクラスを使う方法
  1. String.metaClass.up = { delegate.toUpperCase() }
カテゴリーを使う方法
  1. class StringCategory {
  2.     static up(String s) {
  3.         s.toUpperCase()
  4.     }
  5. }
  1. use (StringCategory.class) {
  2.     println 'abc'.up()          // StringCategory.up('abc') と解釈される
  3. }

Scala

Scala 2.10以降
  1. implicit class StringEx(s: String) {
  2.     def up = s.toUpperCase
  3. }
  1. println("abc".up)               // new StringEx("abc").up() と解釈される
Scala 2.9まで
  1. class StringEx(s: String) {
  2.     def up = s.toUpperCase
  3. }
  4. implicit def stringEx(s: String) = new StringEx(s)

C#

C# 3.0以降
  1. public static class StringEx {
  2.     public static String Up(this string s) {
  3.         return s.ToUpper();
  4.     }
  5. }

JavaScript

  1. String.prototype.up = function() { return this.toUpperCase(); };

CoffeeScript

  1. String::up = -> @toUpperCase()

Ruby

  1. class String
  2.   def up
  3.     upcase
  4.   end
  5. end

戻る

目次

値を変更できる(mutable)人物クラス Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
値を変更できない(immutable)人物クラス Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
クラス名の文字列を元にインスタンスを生成する Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
文字列クラスの3世代親のクラスを取得する(なければ null) Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
オブジェクトの内容(メンバー変数の名前と値)を文字列で表す Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
既存のクラスにメソッドを追加する Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl