1

動物ベースクラス

public class Animal
{

protected String pig;
protected String dog;
protected String cat;

public void setPig(String pig_)
{
  pig=pig_;
}
public void setCat(String cat_)
{
  cat=cat_;
}
public void setDog(String dog_)
{
  dog=dog_;
}

}

アニマルアクションクラス

public class AnimalAction extends Animal
{
  public AnimalAction(String pig, String cat, String dog)
  {
       super.pig = pig;
       super.cat = cat;
       super.dog = dog;
  }

}

これは、保護された変数を設定する正しい方法でしょうか?保護された変数を使用することはこれを行う正しい方法ですか?より専門的なOOの方法はありますか?

4

6 に答える 6

2

保護変数の代わりにプライベート変数を使用できます。これはより適切になります。コンストラクターを使用して、スーパー クラスの値を設定できます。編集:

public class Animal{

    private String pig;
    private String dog;
    private String cat;

    public Animal(String pig,String dog,String cat){
       this.pig=pig;
       this.dog=dog;
       this.cat=cat;
    }

}


public class AnimalAction extends Animal
{ 
  public AnimalAction(String pig, String cat, String dog)
  {
       super(pig,dog,cat);
  } 

}
于 2012-06-11T15:01:43.327 に答える
0

this.pig保護されたメンバーを継承しているので、etcを使用できるはずです。実際にpublic setPig(...)メソッドを呼び出すこともできます。

于 2012-06-11T14:56:02.400 に答える
0

super保護された変数にアクセスするために、プレフィックスやその他のプレフィックスを使用する必要はありません。

ところで-私はある点でトーマスに同意しません-コンストラクターでスーパークラスのセッターメソッドを呼び出さないでください。サブクラスがそれらをオーバーライドする場合、コンストラクターで非最終セッターを使用すると、醜い効果が生じる可能性があります。次に、それらは不完全に構築されたオブジェクトで呼び出される可能性があります。ただし、セッターがオーバーライドされることを意味しない場合は、セッターを最終的なものにすることを検討する必要があります。

「継承またはそれを禁止するための設計」の原則は、JoshuaBlochによるEffectiveJavaの本で説明されています。

于 2012-06-11T14:59:11.803 に答える
0

protectedメンバー変数を使用してサブクラスに継承しても問題ありません。

しかし、開発者がやってきてあなたのクラスをサブクラス化すると、完全に理解していないために混乱する可能性があります。パブリック インターフェース以外のプライベート メンバーでは、物事がどのように行われているかの実装固有の詳細を見ることができないため、後で変更する柔軟性が得られます。提供するprotected member variablesことで、サブクラスとスーパークラスの間を緊密に結合しているだけです。

于 2012-06-11T15:00:59.667 に答える
0

あなたの例は非常に紛らわしいですが、うまくいくでしょう。別の例を挙げます。

// クラス/インターフェース/列挙には大文字を使用し、メソッド/フィールドには小文字を使用します。

public class Animal 
{
protected String name;
protected int numberOfFeet;

public Animal(String name)
{
    this.name = name;
}

public void setNumberOfFeet(int numberOfFeet)
{
    this.numberOfFeet = numberOfFeet;
}
}

public class Dog extends Animal
{
    public Dog()
    {
        super("dog"); // call the constructor of the super class.

        // because Dog extends Animal and numberOfFeet is protected, numberOfFeet becomes part of "this" class.
        this.numberOfFeet = 4;
    }
}

//Now you can create instances of Animal like:
Animal bird = new Animal("bird");
bird.setNumberOfFeet(2);
//Or use Dog to create an animal "dog" with 4 feet.
Animal dog = new Dog();

//after an accident
dog.setNumberOfFeet(3);
于 2012-06-11T15:38:35.283 に答える
0

メンバー変数がクラスの外で見えないほど良いです。クラス変数privateを作成し、ゲッターを公開 (または必要に応じて) し、セッターを保護します。

于 2012-06-11T15:09:27.707 に答える