2005年5月17日

抽象クラスとかね。

今日も学校ー。

いよいよオブジェクト指向ならではな物が
ドンドン出てきてます。わくわく。

で、先週の木曜日、
バタバタしてたので書かなかったけど
そん時、主に習ったのは 配列とstatic。

またまた危なげな勝手解釈で
JavaをperlとPHPに比較しながら書いていきますと…

・配列
Javaには、基本データ型と参照データ型があるけど
配列は参照データ型で、つまりはクラスの1つなんで
インスタンスしないとアカン事、
初期化する際に、配列の数を指定せなアカンってーのが
perlやPHPとは違う気がした部分でした。

 String[] name = new String[5];
 int[] age = new int[5];

…てな感じに使う模様。
[]の中の数字が、配列の数でっせ。
ただし、この配列よりも後で習うlistとやらの方が使うらしい。

・static
static な変数と関数(メソッド)がある模様。
「static変数(クラス変数)」は、perlやPHPで言うなら、
グローバル変数みたいなもん。

「static関数(クラスメソッド)」は、
要はインスタンス化しなくても、使えちゃう関数という事らしい。
ただし、そいつを呼べるのは、同じくstatic関数からのみ。
だから、mainはstaticらしい。

perlやPHPで考えると
「クラスの外にある関数」と同じ立場っぽい。

例えば、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.メンバ変数名; と呼ぶ。

ついでに、perlとPHPとの比較メモ。
perlだけが、すんごく特殊な気が(^^;

 // Java
 public class サブクラス名 extends スーパークラス名 {
   // うんたらかんたら
 }

 // PHP
 class サブクラス名 extends スーパークラス名 {
   // うんたらかんたら
 }

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


・オーバーライド
スーパークラスにあるメソッドと同じ名前で
サブクラス内にメソッドを作り、上書きしちゃう事。
perlやPHPでもあるよね。たぶん。


・インターフェース
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;
  }
 }

こんなのperlやPHPにはないよなぁ???

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

Posted by anigon at 11:59 PM

「Mac mini断念か?」へ戻る | 「回復。」へ進む

上へ戻る