- 追加された行はこの色です。
- 削除された行はこの色です。
* メモ [#u10b9718]
* ユーザー定義型 [#u10b9718]
#contents
* 概要 [#k79548b7]
|項目|pod|struct|class|interface|h
|デフォルトコンストラクタのユーザー定義|x|x|o|x|
|コンストラクタ|o|o|o|x|
|デストラクタ|x|o|o|x|
|静的コンストラクタ&br;静的デストラクタ|o|o|o|x|
|structメンバ変数|x|o|o|x|
|objectメンバ変数|x|o|o|x|
|メンバ関数|o|o|o|o|
|メンバ変数|o|o|o|x|
|ガベージコレクタ対象|x|x|o|o|
|インターフェースの継承|x|x|o|o|
|公開修飾子(public/private)|o|o|o|x|
|代入オーバーロード|x|o|x|x|
|invariant|o|o|o|x|
1 : 全部0で初期化
** interface [#s160dc18]
- C#,Dのinterfaceと同じ
- interfaceは複数にinterfaceを継承することができる
- 純粋仮装関数にはabstractキーワードを先頭につける
- <要検討>デフォルト実装を書くことを許す(本当は許さない方が厳密なinterfaceなんですけど)
#code(c,){{
interface IButtonListener
{
// 抽象関数(絶対実装)
abstract void onButtonPush( in IButton sender )const;
// デフォルト実装ありの関数
void onButtonFocused( in IButton sender )const{}
};
}}
** class [#gcd95ad1]
- 強制的にobject型を継承している
- 他の言語でよくあるclassの継承は不可
- interfaceは何個でも継承できる
** pod [#y7b8ef47]
- plain object data
- C言語のstructに近い
- デフォルトコンストラクタはオブジェクトのメモリ領域を0で初期化する扱いになる
** struct [#g20f0c14]
- 継承のないC++のクラス・D言語のscope classと同じ
- ガベージコレクト対象ではないので参照を保持することができない
* 型公開修飾子 - public private(class,interface,pod,struct) [#t6b68232]
- デフォルトはpublic
- 名前空間直下のprivateな型は同じソース内からしかアクセスができない
#code(c,){{
// 同じソース内からしかアクセスできない
private pod A
{
};
// 誰でもアクセスできる
pod B // public pod Bと同じ
{
A a; // 同じソースなのでOK
};
}}
* メンバ公開修飾子 - public private(class,struct) [#f2079e32]
- public/privateのみ。protectedは無い。
- デフォルトはpublic
- コロンを使うC++スタイル、メンバ変数・関数に直接記述するJAVAスタイルの両方に対応
#code(c,){{
class A
{
//--- 公開修飾子(デフォルトpublic)
// C++/Dスタイル
public:
void funcPubA(){} // public
private:
void funcPriA(){} // private
// JAVA/C#/Dスタイル
public void funcPubB(){} // public
private void funcPriB(){} // private
};
}}
* オーバーライドチェック - override(class) [#a382e838]
- D,C#と同じ
* 不変条件 - invariant(class,pod,struct) [#h6f6ff79]
- (all)Dのinvariantと同じ
- <要検討>structで再帰呼び出しされたらどうしよう(classはカウンタ持たせればいいかな)
* 委譲 - implement(class) [#ga454cd5]
- interfaceのデフォルト実装を別オブジェクトに委譲するキーワード
#code(c,){{
interface IButtonListener
{
abstract void onPushed();
void onFocused(){}
};
class Hoge : IButtonListener
{
public:
override void onPushed(){}
};
class A : IButtonListener implement mHoge
{
// IButtonListenerの関数を全てmHogeに委譲される
// implementを使うと自動で次のように展開される
// override void onPushed(){ mHoge.onPushed(); }
// override void onFocused(){ mHoge.onFocused(); }
private:
Hoge mHoge = new Hoge();
};
class B : public IButtonListener implement mHoge
{
// onFocusedの関数だけ実装、その他はmHogeにまかせる
override void onFocused() { /* */ }
private:
Hoge mHoge = new Hoge();
};
}}
* コンストラクタ - this() (class,pod,struct) [#ta13d165]
- (all)D言語の形式を採用し、関数名はthisを使う
- (all)別コンストラクタ関数コールは可能
- (all)どのコンストラクタよりも前に.Initデータをメモリ領域にセットされる(D言語と同じふるまいをする)
- (pod)デフォルトコンストラクタは定義できない(0初期化固定)
#code(c,){{
class A
{
public:
this()
{
mY = mX + 1;
}
this(in int x, in int y)
{
this();
mX = x;
mY = y;
}
int x = 1; // 直接初期化子がかける(pod,struct限定)
int y; // 指定がないとデフォルトコンストラクタが呼ばれる
};
}}
* デストラクタ - ~this() (class,struct) [#p2eecfc4]
- D言語スタイルを採用
#code(){{
class A
{
public:
~this()
{
}
};
}}
* 静的コンストラクタ・デストラクタ - static this(), static ~this() (class,struct,pod) [#o27052fb]
- D言語と同じ
* メンバ関数/変数 (class,interface,struct,pod) [#l90075b8]
- (all)C++でいうメンバ関数のconst修飾子はあり。引数リストの括弧の後ろにconstを付ける。
- (all)staticメンバ関数が使える。
- (class,pod,struct)staticメンバ変数が使える。仕様はD言語と同じ。
- (class,struct)公開修飾子をつけられる
- (class)抽象関数にoverrideキーワードが使える
- (interface)メンバ変数は使えない
- (interface)純粋仮装関数には先頭にabstractキーワードを付ける
- (interface)デフォルト実装はstatic関数として同じ名前の関数が定義される。
#code(c,){{
interface IName
{
string getName(){ return "NoName"; }
// こう書くと自動でstatic関数が作られる
// static string getName() { return "NoName"; }
// IName.getName()でアクセスできる
};
}}