2012-06-11 3 views
0

животных базового классаJava Расширение класса и установка значений

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_; 
} 

} 

AnimalAction Класс

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

} 

Будет ли это правильный путь, чтобы установить защищенные переменные? Использует ли защищенные переменные правильный способ сделать это? Существует ли более профессиональный способ OO?

+1

Почему у вас есть сеттеры, но не используются? – Poindexter

+1

Просьба загладить ваши уроки. Это стандарт в Java. – cheeken

+0

@Poindexter, используя нестрочные сеттеры в конструкторе, может иметь уродливые эффекты, если подкласс перекрывает их. Вопрос скорее должен быть: «Почему ваши сеттеры не окончательны?» ;) – kostja

ответ

0

Вы должны иметь возможность использовать this.pig и т. Д., Так как вы унаследовали защищенные члены. Вы также можете назвать методы public setPig(...).

+0

Спасибо Томасу, этот общий подход выглядит правильно? – stackoverflow

+0

Он будет работать, но это не очень хороший способ сделать это. Есть еще несколько правильных способов сделать это в других ответах здесь. – Thomas

0

Нет необходимости использовать префикс super или любой другой префикс для доступа к защищенным переменным.

BTW - Я не согласен с Томасом в одной точке - не вызывайте методы сеттера суперкласса в вашем конструкторе. Использование нестрочных сеттеров в конструкторе может иметь уродливые эффекты, если подкласс перекрывает их. Тогда их можно было бы вызвать на не полностью построенном объекте. Но вы должны подумать о том, чтобы сделать ваши сеттеры окончательными, если вы не имеете в виду, что они переопределены.

Принцип «дизайн для наследования или его запрет» поясняется в статье Effective Java book Джошуа Блоха.

0

Нет ничего плохого в использовании переменной-члена protected, а затем наследовать их в подклассе.

Но если разработчик приходит и подклассы вашего класса, они могут испортить его, потому что они не понимают его полностью. С частными членами, помимо публичного интерфейса, они не могут видеть конкретные данные о реализации конкретных вещей, как это делается, что дает вам гибкость в его изменении позже. Предоставляя protected member variables, вы просто соединяете между собой подкласс и суперкласс.

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); 
    } 

} 
0

Чем меньше ваши переменные-члены можно увидеть за пределами класса, тем лучше. Я бы сделал переменные класса private и сделал бы геттеры общедоступными (или по мере необходимости) & сеттеры защищены.

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); 
+0

LOL приятно. Я ценю ответ – stackoverflow

Смежные вопросы