« C4D C.O.F.F.E.E. クラスを使うには…_02 | トップページ | C4D ユーザスクリプトでモーダルダイアログの学習 »

C4D C.O.F.F.E.E. クラスを使うには…_03

クラスのアクセス権:public/private/protected のテスト。

前回にprotectedを加えて3つあります。
違いは?

クラスのメンバへのアクセス権と…

/*
クラスのアクセス権 private/protected/public のテスト
2009.7.30
*/


//class_A-------------------------------
class class_A
{
  private:
    var val_A;

  protected:
    var val_B;

  public:
    var val_C;

    class_A();
    func_A();
}

class_A::class_A()
{
  val_A = 10;
  val_B = 20;
  val_C = 30;
}

class_A::func_A()
{
  println("class_A メンバ関数内---");
  println(val_A);
  println(val_B);
  println(val_C);
}


//class_B-------------------------------
class class_B:class_A
{
  public:
    class_B();
    func_B();
}

class_B::class_B()
{
  super();
}

class_B::func_B()
{
  println("class_B メンバ関数内---");
  println(val_A);
  println(val_B);
  println(val_C);
}




//main-------------------------------
main(doc , op)
{
  var test_A = new(class_A);
  var test_B = new(class_B);

  println("test_A->val_A " , test_A->val_A);
  println("test_A->val_B " , test_A->val_B);
  println("test_A->val_C " , test_A->val_C);

  test_A->func_A();

  println("test_B->val_A " , test_B->val_A);
  println("test_B->val_B " , test_B->val_B);
  println("test_B->val_C " , test_B->val_C);

  test_B->func_B();
}

実行するとエラーが起こります。

[FAIL] Script 'xxxx' Line 54 Pos 17 : Object is protected

クラスのメンバ全てが、publicならばエラーは起こりません。

前回は、次のように説明しました。

アクセス クラス内部 クラス外部
private 可能 不可能
public 可能 可能

privateは、外部からのメンバのアクセスを遮断します。

では、このスクリプトで起きているエラーはどうでしょう?(Line 54)

class_Bのメンバ関数func_B()の定義内で起きています。

class_B::func_B()
{
  println("class_B メンバ 関数内---");
//  println(val_A);//サブクラスからスーパークラスのprivateにはアクセスできません
  println(val_B);
  println(val_C);
}

エラーが起きた行をコメントにします。

アクセス クラス内部 クラス外部 サブクラス内部
private 可能 不可能 不可能
protected ??? ??? ???
public 可能 可能 ???

これで、実行してみましょう。

[FAIL] Script 'xxxx' Line 68 : Member is not PUBLIC

更に、エラーが出ます。(Line 68)

main()関数内です。

main(doc , op)
{
  var test_A = new(class_A);
  var test_B = new(class_B);

//  println("test_A->val_A " , test_A->val_A);//クラス外部からのprivateにはアクセスできません。
  println("test_A->val_B " , test_A->val_B);
  println("test_A->val_C " , test_A->val_C);

  test_A->func_A();

//  println("test_B->val_A " , test_B->val_A);//クラス外部からのprivateにはアクセスできません。
  println("test_B->val_B " , test_B->val_B);
  println("test_B->val_C " , test_B->val_C);

  test_B->func_B();
}

test_B->val_Aはprivateなのでアクセスできません。
クラス外部からのprivateにはアクセスできないのは、前回確認しましたね。
下のtest_B->val_Aのアクセスも同様なのでコメントにしました。

では、続いて実行します。

[FAIL] Script 'xxxx' Line 69 : Member is not PUBLIC

再びエラーが出ました。(Line 69)先ほどの下の行。
test_A->val_Bへのアクセスです。アクセス権はprotectedです。
protectedは外部からのアクセスが不可能という事です。
test_B->val_Bも同様のなので、この行もコメントにします。

main(doc , op)
{
  var test_A = new(class_A);
  var test_B = new(class_B);

//  println("test_A->val_A " , test_A->val_A);//クラス外部からのprivateにはアクセスできません。
//  println("test_A->val_B " , test_A->val_B);//クラス外部からのprotectedにはアクセスできません。

  println("test_A->val_C " , test_A->val_C);

  test_A->func_A();

//  println("test_B->val_A " , test_B->val_A);//クラス外部からのprivateにはアクセスできません。
//  println("test_B->val_B " , test_B->val_B);//クラス外部からのprotectedにはアクセスできません。

  println("test_B->val_C " , test_B->val_C);

  test_B->func_B();
}

アクセス クラス内部 クラス外部 サブクラス内部
private 可能 不可能 不可能
protected ??? 不可能 ???
public 可能 可能 ???

既に結論が出ているものもありますが、更に実行します。

test_A->val_C 30
class_A メンバ関数内---
10
20
30
test_B->val_C 30
class_B メンバ関数内---
20
30

正常に終了しました。

クラス内部からのprotectedにはアクセスが可能です。
サブクラス内からはprotected/public共にアクセスが可能です。

アクセス クラス内部 クラス外部 サブクラス内部
private 可能 不可能 不可能
protected 可能 不可能 可能
public 可能 可能 可能

これで、表が完成しました。

クラス内からは、全てがアクセス可能
サブクラスからは、private以外はアクセス可能
クラス外部は、publicのみアクセス可能

と、いう事ですね。

ま、こんな事しなくてもSDKに書いてあり、検索するとすぐ出てきますけどね…

これで、クラスの大体の事を確認できたと思います。
まだか…?でも一応クラスの事は終了。

|

« C4D C.O.F.F.E.E. クラスを使うには…_02 | トップページ | C4D ユーザスクリプトでモーダルダイアログの学習 »