2015-01-07 3 views
0

나는이 추상 기본 클래스를 가지며 각 자식 클래스에는 특정 필수 기능이 있어야하지만 약간 다르다. 이것은 추상 클래스를 사용하여 가능합니까? 아니면이 인터페이스를 사용해야합니까?어린이의 추상적 수업 및 필수 방법?

나는 어떻게이 구조에 대한 갈 것이라고이

public abstract class Animal 
{ 
    //Mandatory method 
    Public void sound() 
    { 

    } 
} 

public class Cat extends Animal 
{ 
    public void sound() 
    { 
     System.out.println("Miauw"); 
    } 
} 

public class Dog extends Animal 
{ 
    public void sound() 
    { 
     System.out.println("Woof"); 
    } 
} 

//I will put all these child objects in a List<Animal> and need to call these methods. 

for (Animal a : animalList) 
{ 
    a.sound(); 
} 

같은 구조를 사용하는 것입니다? 자식 클래스간에 공유해야하는 동일한 메서드가 많기 때문에 추상 클래스를 사용하고 있다고 덧붙여 야합니다. 메소드 중 일부만 서로 다르되 필수 클래스이며 기본 클래스에서 액세스 할 수 있어야합니다.

+0

어떤 Java 버전을 사용합니까? – divanov

+1

액세스 수정자는 Java에 유효하지 않습니다. –

+0

일반적인 팁 사용 인터페이스 항상, 추상 클래스는 다른 서브 클래스 주위에 일부 메소드의 동일한 구현이있는 경우에만 사용됩니다. –

답변

3

당신이 찾고 있습니다 :

public abstract class Animal 
{ 
    //Mandatory method 
    abstract public void sound(); 
} 

그러나 다른 사용자의 조언을보고 : 메소드 이름

  • public 항상 소문자
  • 용도의 인터페이스에가는 키워드에 대한

    • 사용 소문자 Animal 클래스에 모든 자식 클래스에 대한 공통 코드가없는 경우
  • +0

    메소드 이름이 대문자로 시작하는 이유는 무엇입니까? 이는 Java 코드 표준에 위배됩니다. – divanov

    +0

    그의 예를 복사했습니다. –

    +0

    감사합니다.이 작업을 수행 할 때 오류가 발생했지만 중괄호를 제거해야했습니다. 이것은 정확하게 내가 찾고 있었던 것이었다. 나는 C#을 배우기 시작했고,주의를 기울이지 않고 서둘러 종이에 물건을 집어 넣을 때 나는 여전히 컨벤션을 명명하는 C 샤프를 사용하고 있습니다. – Madmenyo

    1

    이 경우 추상 클래스와 인터페이스가 모두 작동합니다. 추상 클래스를 사용하려는 경우는 모든 하위 클래스에서 공유 할 공통 메소드와 데이터가있는 경우입니다. 예를 들어, Animal의 경우 가중치 변수가 있고 각 하위 클래스가 해당 변수를 설정합니다.

    참고 : 추상 클래스에서 구현하고 싶지 않은 메서드는 추상으로 선언해야합니다. 아래에서 Sound()을 어떻게 수정했는지보십시오. 또한, 보너스 팁은 메서드 이름이 소문자로 시작해야한다고 표준에서 말했기 때문에 Soundsound으로 변경했습니다.

    public abstract class Animal 
    { 
        private int weight; 
    
        public void setWeight(int weight) { 
         this.weight = weight; 
        } 
    
        public int getWeight() { 
         return weight; 
        } 
    
        //Mandatory method 
        abstract public void sound(); 
    } 
    
    public class Cat extends Animal 
    { 
        public Cat(int weight) { 
         this.setWeight(weight); 
        } 
    
        public void sound() 
        { 
         System.out.println("Miauw"); 
        } 
    } 
    
    public class Dog extends Animal 
    { 
    
        public Dog(int weight) { 
         this.setWeight(weight); 
        } 
    
        public void sound() 
        { 
         System.out.println("Woof"); 
        } 
    } 
    
    1

    Java의 abstract 수정자를 찾고 있습니다. The official Java Documentation contains more specific information about abstract and final here.

    public abstract class Animal 
    { 
        // Mandatory method with no "default" implementation. 
        public abstract void Sound(); 
    
        // Optional method with a default implementation. 
        public void Move() { 
         // some actions here 
        } 
    
        // Optional method with a fixed implementation (it can't be changed in a child class). 
        public final void Eat(Food food) { 
         // some actions here 
        } 
    } 
    
    +0

    모든 메소드 이름이 대문자로 시작하는 이유는 무엇입니까? 이는 Java 코드 표준에 위배됩니다. – divanov

    +0

    나는 그 사람과 같은 스타일을 사용하고 있었다. –

    +0

    그리고 예제를 빨리 타이핑하고 C#으로 대다수의 프로그래밍을 배웠습니다. 따라서 대문자 메서드 이름을 사용했습니다. – Madmenyo

    0

    당신이 어떤 방법을 정의하지 않기 때문에 당신은 단지 당신이 방법을 재정 의하여 오버 헤드 추상 클래스를 사용하는 경우 그

    에 대한 괜찮 선언 인터페이스를 제공하려는 경우,이 경우 인터페이스를 사용해야하며, 다시 정의하십시오

    +0

    나는 의도 한대로 추상적 인 방법을 사용하고있다. 여기에 예를 넣으려고했는데, 모든 어린이들은 정확히 똑같은 방법을 많이 필요로하지만 약간은 약간 다른 방법이 필요하지만 필수적인 방법은 많이 필요합니다. – Madmenyo

    +0

    또한 필수 메소드의 정의를 제공하려는 경우 해당 확인을 수행하십시오. – user3619843