クラスを定義するには
C言語 2016/10/15
構造体定義の例
struct FooStruct {
/* メンバ変数宣言 */
int field1;
int field2;
}
C言語にはクラスはない。データ構造を作れる構造体というものがある。構造体は他の言語でのクラスと比較すると、メソッド(メンバ関数)がなく、フィールド(プロパティ、メンバ変数)がすべて public になっている。
C++ 2014/01/26
クラス定義の例
class FooClass : public SuperClass {
private:
// メンバ変数宣言
int field1;
int field2;
public:
// コンストラクタ宣言
FooClass();
// デストラクタ宣言
~FooClass();
// メンバ関数宣言
void method1();
// 静的メンバ変数宣言
static int sfield1;
// 静的メンバ関数宣言
static int smethod1();
}
// メソッド定義
void FooClass::method1(){
...;
}
アクセス修飾子(public
や private
)は、
Javaなどのようにメンバごとに付けるのではなく、上記例のようにグループ分けして書く。
またクラス宣言の中にはメンバ関数(メソッド)はシグニチャの宣言のみを書いて、メンバ関数の定義はクラス宣言の外側に書く。クラス宣言の外側ではクラス名とメソッド名を二重コロン(::
)でつなぐ。普通はクラス宣言はヘッダファイルに書き、メンバ関数定義はソースファイルに書く。
Java 2017/01/10
クラス定義の例
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 2016/10/15
クラス定義の例
class FooClass (arg1: Int, val field1: String) extends SuperClass width SuperInterface {
// 上の括弧はコンストラクタの引数になる
// field1 はインスタンスフィールドになる
// インスタンスメソッド定義
def method1() {
...;
}
}
Javaと違い、クラス名とソースファイル名を一致させる必要はなく、1ソースファイルに複数のクラスを定義することも可能。
case class 2016/10/15
case class
は class
に比べいくつかのメソッドやフィールドが自動で定義される便利なクラス定義。
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 2015/06/25
クラス定義の例
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 2014/12/13
クラス定義の例
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
にメソッドを追加するということもできる。