[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: 抽象クラス (was Re: staticの使い方(メソッド) )





こんばんは。
西沢@xxxxxxxxxxイーサー・プラニックです。

#こちらは抽象クラスの話+私が実装するとしたら。。。です。

Kazuya Maebashi <maebashi@xxxxxxxxxx> wrote:
at [Wed, 28 Apr 1999 12:03:15 +0900]
> あのー、これはもしかして、そういう抽象クラスを継承するという
> ことでしょうか?

そうです。
抽象クラスはスーパークラスを指しています。


> 単一継承しか許していないJavaで、「よく使う」という理由だけで
> 継承を使っちゃったら困りませんか? 継承はやっぱり、is aの関係
> があるときだけにしないと...
> 
> 読書会には出ていませんが、Peter Coadの「Javaオブジェクト設計」
> の「継承のチェックポイント」にも、
> 
>  4.ユーティリティクラス(何度も利用したい便利な機能を持つクラ
>    ス)に過ぎないクラスをサブクラス化するのではない。
> 
> と書いてありますし...

すいません。
ちょっとの例だけで、その他の説明をしませんでしたので、そう解釈されても
仕方なかったですね。(^^;)

よく使うというよりも、そのサービスがあるべき場所、適用されるクラスを
考えた場合、給料の計算なら社員系の抽象クラスが持てば良いわけです。

これも極端な例になってしまいますが、、、(矢印は継承の意味)

動物 =(継承)=> 人間 ==> 働く人 ==> 会社員 ==> 某会社員 ==> 社員

と言う風なクラス構造だった場合、給料計算のロジックは会社員、もしくは
会社別に違う給料計算だと思うので、某会社員にでも実装するのが自然かと
思います。
仮に働く人であっても、給料をもらう人だけじゃなくて払う人もいるだろうし
人間だからって給料をもらっているとも限りません。

#いくら汎用的でも給料計算なら使うクラスは限られるはずですよね。

また、給料計算が上記の系統以外でも使用できる汎用性が高い場合でも、
スーパークラスで、そのユーティリティクラスを使えるように実装すれば
スマートだと思います。

という思考で実装すると。。。


public abstract class 某会社員 {
  protected int 勤続年数 = 0;
  protected int 等級 = 1;
  protected int 勤務評価 = 0;
  protected int 残業時間 = 0;
  
  public int get勤続年数() {
    return 勤続年数;
  }
  public void set勤続年数(int a勤続年数) {
    勤続年数 = a勤続年数;
  }
  〜〜〜〜〜
  〜〜〜〜〜
  public int get給料() {
    int 給料 = 計算クラス.給料(勤続年数,等級,勤務評価,残業時間);
    return 給料;
  }
  public int get賞与() {
    int 賞与 = get給料() * get賞与率();
  }
  abstract protected int get賞与率();
}

public class 平社員 extends 某社員 {
  protected int 経験値 = 0;
  public int get経験値() {
    return 経験値;
  }
  protected void set経験値(int a経験値) {
    経験値 = a経験値;
  }
  protected int get賞与率() {
    return 経験値 * 0.03;
  }
}

public class 課長 extends 某社員 {
  protected int get賞与率() {
    return 3.5;
  }
}

#わかりやすいように日本語で記述しました。

汎用性がありそうなロジックは、まず抽象クラスに昇格させて、それ以上
に使える場合にユーティリティクラスにしてからでも遅くないと思います。

という感じで、よく使うメソッドはまず抽象クラスに実装するのが
ベストかと思います。



----------------------------------------
西沢 篤行 <anishi@xxxxxxxxxx>
株式会社イーサー・プラニック
Tel 03-5822-1330 / Fax 03-5822-1338