부모 클래스에서 선언 된 자식 클래스에서 변수를 인스턴스화 할 수 있습니까? 장점은 무엇입니까? 예 :자식 클래스에서 변수를 인스턴스화
public class Animal{ Food foodType;}
public class Dog extends Animal{
public Dog(){
foodType=new Food();
}
}
부모 클래스에서 선언 된 자식 클래스에서 변수를 인스턴스화 할 수 있습니까? 장점은 무엇입니까? 예 :자식 클래스에서 변수를 인스턴스화
public class Animal{ Food foodType;}
public class Dog extends Animal{
public Dog(){
foodType=new Food();
}
}
장점 : 예를 들어
.
DogFood 클래스가 Food를 확장하면 Dog가 인스턴스를 생성 할 수 있습니다 (DogFood에 대해 Dog가 알고있는 경우). Animal은 DogFood에 대해 알 필요가 없습니다.
코드를 단순화합니다.
이렇게하는 것이 많은 이점이 있습니다. 실제로 디자인에 달려 있습니다.
나는 예를 들어, 내가 할 수있는 더 나쁜 예를 만들었지 만, 네 생각을 분명히 해줄 것이라고 생각한다. 방금 코드를 따라하려고했습니다.
이 예제에서는 Strategy
디자인 패턴과 Inversion of Control
을 사용합니다. 동물은 음식 구현에 대해 아무 것도 모른다는 것을 알 수 있습니까? 그것에 대해 생각해 보면 Animal.eat()
은 eat()
메서드를 변경하지 않고 여러 구현을 실행할 수 있습니다. OOP가 할 수있는 일이 조금 있습니다. 식품 유형으로
public class Main {
public static void main(String ... args){
Animal paul = new Dog("Paul");
Animal elsa = new Cat("Elsa");
paul.eat();
elsa.eat();
}
public static abstract class Animal {
private String name;
protected Food foodType;
public Animal(String name){
this.name = name;
}
public void eat() {
System.out.println("The " + name + " has eaten " + foodType.getAmount() + " " + foodType.foodName());
}
}
public static class Dog extends Animal {
public Dog(String name) {
super(name);
foodType = new DogFood();
}
}
public static class Cat extends Animal {
public Cat(String name) {
super(name);
foodType = new CatFood();
}
}
public interface Food {
int getAmount();
String foodName();
}
public static class DogFood implements Food{
@Override
public int getAmount() {
return 2;
}
@Override
public String foodName() {
return "beef";
}
}
public static class CatFood implements Food{
@Override
public int getAmount() {
return 5;
}
@Override
public String foodName() {
return "fish";
}
}
}
예를 들어 주셔서 감사합니다. Inversion of Control은 나를위한 화술입니다. – Alexis
'Inversion of Control'은 이해하기 쉽습니다. 규칙에 따라 객체가 클래스를 변경하지 않고 다른 구현을 실행할 수있는 경우이 클래스는 'IoC'를 구현합니다. 예를 들어,'Thread.class'가,'Runnable' 구현의 실행을 처리하기 위해서'IoC'를 사용합니다. – Paulo
고마워, 아주 간단하고, 허 ... 더 개인적인 질문 : 디자인 패턴을 이해하고 제대로 사용하는 데 얼마나 걸리나요? 그냥 단서 ... – Alexis
는 동물의 특성, 항상 특정 자식 클래스에 대해 동일합니다, 그것을 동물의 final
을 확인하고 동물 생성자를 통해 그것을 전달합니다.
public class Animal {
public final Food foodType;
public Animal(Food foodType) {
this.foodType = foodType;
}
}
public class Dog extends Animal{
public Dog() {
super(new DogFood());
}
}
지금 모든 동물 (아이)는 foodType을 가지고 있으며, 하나는 부모 클래스의 필드를 채울 필요가 없습니다. 책임은 그들이 있어야 할 곳입니다.
변수가 하위에 표시 될 수 있습니다. – nickb
@nickb 아직 인스턴스화되지 않았습니다. – Toris
속성의 수식어가 보호되어 있으면 할 수 있습니다. 기본값 인 경우 자녀가 동일한 학부모 패키지에있는 경우이를 수행 할 수 있습니다. 물론 그것이 공개되면 모든 곳에서 할 수 있습니다. – Paulo