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

在类外看到的成员变量越少越好。我会制作类变量private并使 getter 公开(或根据需要)和 setter 受保护。

于 2012-06-11T15:09:27.707 回答
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

您应该可以使用this.pigetc,因为您继承了受保护的成员。您也可以实际调用这些public setPig(...)方法。

于 2012-06-11T14:56:02.400 回答
0

无需使用super前缀或任何其他前缀来访问受保护的变量。

顺便说一句 - 我有一点不同意 Thomas - 不要在构造函数中调用超类的 setter 方法。如果子类覆盖它们,在构造函数中使用非最终设置器可能会产生丑陋的效果。然后可以在不完全构造的对象上调用它们。但是,如果您不打算将 setter 覆盖,则应该考虑将它们设置为 final。

Joshua Bloch在Effective Java 一书中解释了“为继承而设计或禁止它”的原则。

于 2012-06-11T14:59:11.803 回答
0

protected使用成员变量然后在子类中继承它们没有错。

但是,如果开发人员出现并将您的类子类化,他们可能会搞砸,因为他们不完全理解它。对于私有成员,除了公共接口之外,他们无法看到具体的实现细节,这让您可以灵活地在以后更改它。通过提供protected member variables您只是在子类和超类之间紧密耦合。

于 2012-06-11T15:00:59.667 回答