web-dev-qa-db-ja.com

Java-変数を含む抽象クラス?

抽象クラスにインスタンス変数を定義させるのは良い習慣ですか?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

サブクラスExternalJavaScript.classはソース変数を自動的に取得しますが、継承からではなく、すべてのサブクラス自体がソースを定義する方がコードを読みやすいと感じています。

あなたのアドバイスは何ですか?

/アダム

24
Adam Asham

変数を追加しているので、このようなものの方がはるかに優れていると思っていたので、アクセスを制限してきれいにしましょう。あなたのゲッター/セッターはブリキについて彼らが言うことをするべきです。

public abstract class ExternalScript extends Script {

    private String source;

    public void setSource(String file) {
        source = file;
    }

    public String getSource() {
        return source;
    }
}

これを質問に戻して、それを読むときにゲッター/セッターのコードがどこにあるのか悩んでいますか?それらすべてが取得および設定を行う場合、コードを読み取るときに関数が「行う」ことを心配する必要はありません。考えるべき理由は他にもいくつかあります。

  • ソースが保護されている(サブクラスからアクセスできる)場合、コードは乱雑になります:変数を変更しているのは誰ですか?オブジェクトの場合、リファクタリングが必要になると難しくなりますが、メソッドはこのステップを簡単にする傾向があります。
  • ゲッター/セッターメソッドが取得および設定されていない場合は、それらを別のものとして記述します。

クラスが本当に違うものであるかどうかを常に考えてください。そうすれば、それ以上何かが必要かどうかを判断するのに役立ちます。

32
Egwor

もちろん?
抽象基本クラスは、2つ以上のクラスに共通する動作とデータを1つの場所に格納して、ストレージとメンテナンスの効率を高めるための便利なものです。その実装の詳細。
ただし、インターフェイスを使用する必要がある場所では抽象基本クラスを使用していないことに注意してください。 Interface vs Base class を参照してください

8
Gishu

もちろん。抽象クラスの全体的な考え方は、すべてのサブクラスに含める必要がある動作またはデータを含めることができるということです。 WheeledVehicleの簡単な例を考えてみましょう-numWheelsメンバー変数が必要です。すべてのサブクラスにこの変数が必要です。抽象クラスは、APIを開発するときに非常に便利な機能であることを忘れないでください。APIを拡張する人々がそれを壊さないようにすることができるからです。

2
Dermot