2016-10-23 5 views
-1

부모 클래스에서 선언 된 자식 클래스에서 변수를 인스턴스화 할 수 있습니까? 장점은 무엇입니까? 예 :자식 클래스에서 변수를 인스턴스화

public class Animal{ Food foodType;} 
public class Dog extends Animal{ 
    public Dog(){ 
     foodType=new Food(); 
    } 
} 
+0

변수가 하위에 표시 될 수 있습니다. – nickb

+0

@nickb 아직 인스턴스화되지 않았습니다. – Toris

+0

속성의 수식어가 보호되어 있으면 할 수 있습니다. 기본값 인 경우 자녀가 동일한 학부모 패키지에있는 경우이를 수행 할 수 있습니다. 물론 그것이 공개되면 모든 곳에서 할 수 있습니다. – Paulo

답변

0

장점 : 예를 들어

.
DogFood 클래스가 Food를 확장하면 Dog가 인스턴스를 생성 할 수 있습니다 (DogFood에 대해 Dog가 알고있는 경우). Animal은 DogFood에 대해 알 필요가 없습니다.

코드를 단순화합니다.

1

이렇게하는 것이 많은 이점이 있습니다. 실제로 디자인에 달려 있습니다.

나는 예를 들어, 내가 할 수있는 더 나쁜 예를 만들었지 만, 네 생각을 분명히 해줄 것이라고 생각한다. 방금 코드를 따라하려고했습니다.

이 예제에서는 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"; 
     } 
    } 
} 
+0

예를 들어 주셔서 감사합니다. Inversion of Control은 나를위한 화술입니다. – Alexis

+1

'Inversion of Control'은 이해하기 쉽습니다. 규칙에 따라 객체가 클래스를 변경하지 않고 다른 구현을 실행할 수있는 경우이 클래스는 'IoC'를 구현합니다. 예를 들어,'Thread.class'가,'Runnable' 구현의 실행을 처리하기 위해서'IoC'를 사용합니다. – Paulo

+0

고마워, 아주 간단하고, 허 ... 더 개인적인 질문 : 디자인 패턴을 이해하고 제대로 사용하는 데 얼마나 걸리나요? 그냥 단서 ... – Alexis

0

는 동물의 특성, 항상 특정 자식 클래스에 대해 동일합니다, 그것을 동물의 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을 가지고 있으며, 하나는 부모 클래스의 필드를 채울 필요가 없습니다. 책임은 그들이 있어야 할 곳입니다.

관련 문제