クラスを定義するには

C言語

構造体定義の例

struct FooStruct {
    /* メンバ変数宣言 */
    int field1;
    int field2;
}

C言語にはクラスはない。データ構造を作れる構造体というものがある。構造体は他の言語でのクラスと比較すると、メソッド(メンバ関数)がなく、フィールド(プロパティ、メンバ変数)がすべて public になっている。

C++

クラス定義の例

class FooClass : public SuperClass {

private:
    // メンバ変数宣言
    int field1;
    int field2;

public:
    // コンストラクタ宣言
    FooClass();

    // デストラクタ宣言
    ~FooClass();

    // メンバ関数宣言
    void method1();

    // 静的メンバ変数宣言
    static int sfield1;

    // 静的メンバ関数宣言
    static int smethod1();

}

// メソッド定義
void FooClass::method1(){
    ...;
}

アクセス修飾子(publicprivate)は、 Javaなどのようにメンバごとに付けるのではなく、上記例のようにグループ分けして書く。

またクラス宣言の中にはメンバ関数(メソッド)はシグニチャの宣言のみを書いて、メンバ関数の定義はクラス宣言の外側に書く。クラス宣言の外側ではクラス名とメソッド名を二重コロン(::)でつなぐ。普通はクラス宣言はヘッダファイルに書き、メンバ関数定義はソースファイルに書く。

Java

クラス定義の例

class FooClass extends SuperClass {
    
    // インスタンスフィールド定義
    private int field1;
    private int field2 = 0; // 値の代入と同時の場合
    
    // コンストラクタ定義
    public FooClass() {
        ...;
    }
    
    // インスタンスメソッド定義
    public void method1() {
        ...;
    }
    
    // クラスフィールド定義
    private static int sfield1;
    private static int sfield2 = 0; // 値の代入と同時の場合
    
    // クラスフィールドの初期化ブロック
    static {
        ...;
    }
    
    // クラスメソッド定義
    public static void smethod1() {
        ...;
    }
    
}

クラス定義を書くソースファイルのファイル名はクラス名と一致させないといけない。 FooClassというクラスを定義したソースファイルであれば FooClass.java という名前のファイルに書く必要がある。 1クラスに1ソースファイル必要である。

トップレベルのクラスではなく、クラス定義やメソッド定義の中に書く内部クラスはその限りではない。

Scala

クラス定義の例

class FooClass (arg1: Int, val field1: String) extends SuperClass width SuperInterface {
  // 上の括弧はコンストラクタの引数になる
  // field1 はインスタンスフィールドになる

  // インスタンスメソッド定義
  def method1() {
    ...;
  }

}

Javaと違い、クラス名とソースファイル名を一致させる必要はなく、1ソースファイルに複数のクラスを定義することも可能。

case class

case classclass に比べいくつかのメソッドやフィールドが自動で定義される便利なクラス定義。

case class FooCaseClass(field1: Int, field2: String) extends SuperClass;

どんなメソッドやフィールドが自動で定義されるのかについては、以下のページがわかりやすい。

ケースクラス (Hishidama’s Scala class Memo)
http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html#h_case_class

PHP

クラス定義の例

class FooClass extends SuperFooClass {
    
    // インスタンスフィールド定義
    private $field1;
    private $field2;
    
    // クラスフィールド定義
    private static $sfield1;
    private static $sfield2;
    
    // コンストラクタ定義
    public function __construct(){
        parent::__construct();
        ...;
    }
    
    // PHP 5.3.2 まではクラスと同じ名前でコンストラクタを定義できた
    // function FooClass(){
    //     ...;
    // }
    
    // デストラクタ定義
    public function __destruct(){
        ...;
        parent::__destruct();
    }
    
    // インスタンスメソッド定義
    public function method1(){
        ...;
    }
    
    // クラスメソッド定義
    public static function smethod1(){
        ...;
    }
    
}

Ruby / JRuby

クラス定義の例

class FooClass < SuperFooClass
  
  # インスタンス初期化メソッド
  def initialize
    @field1 = ... # インスタンス変数
  end
  
  # メソッド定義
  def method1
    ...
  end
  
  # フィールドへの読み取り専用アクセッサの作成
  attr_reader :field1, :field2
  
  # フィールドへの読み書きアクセッサの作成
  attr_accessor :field3, :field4
  
  # クラスの特異メソッド
  # Javaでいうstaticメソッドのようなもの
  def self.smethod1
    ...
  end
  
  # クラスの特異メソッドの別の定義の仕方
  class << self
    # この中のメソッドはすべてクラスの特異メソッドになる
    
    def smethod2
      ...
    end
    
    def smethod3
      ...
    end
    
  end
  
end

こういったクラスの定義式は、新しいクラスを生成してそれを FooClass という名前の定数に割り当てる定数定義の動作である。つまりクラス名は定数の名前にすぎない。 Rubyの文法では定数は大文字で始まる必要があるので、クラス名も大文字ではじめなければならない。

定数定義と同じなので、モジュールの中でクラスが定義されれば二重コロン :: を使ってアクセスできる。

module Foo
  class Bar
  end
end

a = Foo::Bar.new

Rubyにはオープンクラスという他の言語にはない特徴もある。すでに定義済みのクラス名で、クラスの定義式を再度書くと、再度書いたクラス定義の中に含まれるメソッドを定義済みのクラスに追加するような動作になる。

オープンクラスの性質により、例えば組み込みのクラスStringにメソッドを追加するということもできる。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク