frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

抽象クラスとかね。

今日も学校ー。

いよいよオブジェクト指向ならではな物が

ドンドン出てきてます。わくわく。

で、先週の木曜日、

バタバタしてたので書かなかったけど

そん時、主に習ったのは 配列とstatic。

またまた危なげな勝手解釈で

JavaperlPHPに比較しながら書いていきますと…

・配列

Javaには、基本データ型と参照データ型があるけど

配列は参照データ型で、つまりはクラスの1つなんで

インスタンスしないとアカン事、

初期化する際に、配列の数を指定せなアカンってーのが

perlPHPとは違う気がした部分でした。

 String name = new String[5];

 int age = new int[5];

…てな感じに使う模様。

[]の中の数字が、配列の数でっせ。

ただし、この配列よりも後で習うlistとやらの方が使うらしい。

・static

static な変数と関数(メソッド)がある模様。

「static変数(クラス変数)」は、perlPHPで言うなら、

グローバル変数みたいなもん。

「static関数(クラスメソッド)」は、

要はインスタンス化しなくても、使えちゃう関数という事らしい。

ただし、そいつを呼べるのは、同じくstatic関数からのみ。

だから、mainはstaticらしい。

perlPHPで考えると

「クラスの外にある関数」と同じ立場っぽい。

例えば、perlで言うなら…

 # クラス内のメソッドを使う場合

 $objDB = new DB();  # インスタンス

 $objDB->connect();  # DBクラスのconnectメソッドを使う

 # 「staticメソッド」にあたる関数を使う場合

 &DB::connect();   # package DB 内のconnect関数を使う

 &connect();     # どっかのconnect関数を使う

続いて、PHPで言うなら…

 // クラス内のメソッドを使う場合

 $objDB = new DB();  // インスタンス

 $objDB->connect();  // DBクラスのconnectメソッドを使う

 // 「staticメソッド」にあたる関数を使う場合

 connect();   // どっかのconnect関数を使う

…こんな感じか?(^^;

ほんで、今日の授業。

継承・オーバーライド・インターフェース・抽象クラスがテーマ。

・継承

- PHPと全く同じで、extendsを使い

 コンストラクタ以外のものが

 スーパークラスから継承される。

- スーパークラス多重継承する事は出来ない

- extendsを使わないスーパークラスですら

 構造上では、Objectクラスのサブクラスという位置づけになる。

- スーパークラス内のメンバ変数、メソッドを呼ぶ場合は、

 super.メンバ変数名; super.メソッド名();

 …と書くが、super.メンバ変数を呼ぶのは、よろしくない(^^;

- サブクラス内で、自分のメンバ変数を呼ぶ場合は、

 PHP同様 this を使い、this.メンバ変数名; と呼ぶ。

ついでに、perlPHPとの比較メモ。

perlだけが、すんごく特殊な気が(^^;

 // Java

 public class サブクラス名 extends スーパークラス名 {

   // うんたらかんたら

 }

 // PHP

 class サブクラス名 extends スーパークラス名 {

   // うんたらかんたら

 }

 # perl

 @ISA = qw( スーパークラス名 );

・オーバーライド

スーパークラスにあるメソッドと同じ名前で

サブクラス内にメソッドを作り、上書きしちゃう事。

perlPHPでもあるよね。たぶん。

・インターフェース

perlにはないような(^^;?

PHPには、5から導入されたらしい機能。

インスタンス化出来ない、大雑把なクラスのような物で、

含まれているのは、

引き数・戻り値の型を決めただけのメソッドと定数のみ。

これを継承してクラスを作り、

そのクラスをインスタンス化して使うが、

継承したクラス内では、必ずインターフェース内で定義した

メソッドを実装する事。

なお、クラスはクラスの多重継承は出来ないが、

インターフェースの多重継承は出来る。

例)

 public interface インターフェース名1 {

  public void メソッド名1(); // 抽象メソッド

  public 戻り値の型 メソッド名2( int 引き数 ); // 抽象メソッド

 }

 public interface インターフェース名2 {

  public void メソッド名3(); // 抽象メソッド

 }

 // 継承する側

 public class クラス名 implements インターフェース名1, インターフェース名2 {

  public void メソッド名1() {

   // 中身を書く

  }

  public 戻り値の型 メソッド名2( int 引き数 ) {

   // 中身を書く

  }

  public void メソッド名3() {

   // 中身を書く

  }

  // その他、インターフェースにないメソッド・変数などを設定可能

 }

ちなみに、以前の会社で、perlを使いながらも、

抽象メソッドみたいな書き方をしてた事があった。

sub 関数名(引き数の型); てな感じに。

これはなんて呼べばいいんだろう?(^^;

追記:

これはプロトタイプという機能でした(^^)

・抽象クラス

インターフェースとクラスのあいのこ(^^;

抽象メソッドを持ってもいいし、

メンバ変数も持っていいし、

完全なメソッドも持っても良いが、

やっぱりインスタンス化出来ないので、

他のクラスに継承した上で、使用する事。

例)

 public abstract class 抽象クラス名 {

  String errMessage;

  public abstract void メソッド名1(); // 抽象クラス

  public String returnError() { // 普通のメソッド

    return this.errMessage;

  }

 }

こんなのperlPHPにはないよなぁ???

…てな感じで、今日の授業まとめ、おしまい。