30

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

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

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

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

/アダム

4

3 に答える 3

35

変数を追加しているので、このようなものがはるかに優れていると思っていたので、アクセスを制限してクリーンにしてみませんか? ゲッター/セッターは、缶に書かれていることを行う必要があります。

public abstract class ExternalScript extends Script {

    private String source;

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

    public String getSource() {
        return source;
    }
}

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

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

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

于 2008-10-25T10:52:28.303 に答える
9

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

于 2008-10-25T10:40:47.047 に答える
3

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

于 2008-10-25T11:49:29.347 に答える