2014-03-05 4 views
2

구현 단계에서 인터페이스와 상속이 작동하는 방식에 약간 혼란스러워집니다. 다음은 빠른 ERD입니다.인터페이스 및 상속 구현

그래서 여기에 Animal 클래스를 확장 한 개가 있고 ColorChangable 인터페이스도 구현됩니다. 이제 colorchangeable 인터페이스의 작업은 Dog가 아닌 animal에 속한 속성 인 색상을 업데이트하는 것입니다. 그렇다면 개 클래스의 색상을 업데이트하는 올바른 방법은 무엇입니까? 동물이 아닌 색을 구현하는 개입니다. 지금은이 있습니다

public class Dog extends Animal implements IColorChangable 
{ 
    private String breed; 

    public Dog(int color, String breed) 
    { 
     super(color); 
     this.breed = breed; 
    } 

    public void changeColor() 
    { 
     //How to have access to color? 
    } 
} 

public interface IColorChangable 
{ 
    public void changeColor(); 
} 

답변

2

기본적으로 세 가지 옵션이 있습니다.

public class Animal { 
    protected int color; 
    ... 
} 

public class Dog extends Animal implements IColorChangable { 
    ... 
    @Override public void changeColor() { 
     color = ...; 
    } 
} 

: 어떤 당신이 선택은 당신의 불변의 복잡성 등

첫 번째 옵션은 당신은 파생 클래스에 직접 액세스 할 수 Animalprotectedcolor을 선언하는 것입니다, 당신의 요구 사항에 따라 달라집니다 두 번째 옵션은 privateAnimal에 선언하는 것입니다.이 경우 하위 클래스로 직접 액세스 할 수 없지만 Animal에 설정자를 추가 할 수 있습니다 (규칙에 따라 final, 선택적으로 protected).

public class Animal { 
    private int color; 
    ... 
    protected final void setColor (int color) { // could be public, could be non-final 
     this.color = color; 
    } 
} 

public class Dog extends Animal implements IColorChangable { 
    ... 
    @Override public void changeColor() { 
     setColor(...); 
    } 
} 

세 번째 옵션은 질문을 고려하는 것입니다 : : 예를 들어, 당신은 기본 클래스에서 일반적으로 검증 로직을 구현하려는 경우에 유용합니다 모든 동물의 색상이 변경 될 수 있습니까? (당신의 예에서, color은 일반적인 Animal의 한 속성입니다.) 그렇다면, 당신은 Animal 수 있습니다 대신 인터페이스를 구현하는 경우 :

public class Animal implements IColorChangable { 
    private int color; 
    ... 
    @Override public void changeColor() { 
     color = ...; 
    } 
} 

public class Dog extends Animal { 
    ... 
} 

정말 당신이해야 할 일에 따라 달라집니다.

실제로 COM 데이터베이스에있는 것처럼 인터페이스 이름을 I과 함께 시작하는 것은 전통적으로 입니다. 또한 우리는 일반적으로 "속성"보다는 "속성"을 사용합니다.:)

3

그래서 당신은 단지 당신의 동물 클래스에 setColor를하고 getColor에서를 추가해야하지만 당신은 public 메소드로 정의한다.

public void setColor(int color){ 
    this.color = color; 
} 

public int getColor(){ 
    return color; 
} 

그런 다음 changeColor mthod에서 setColor를 통해 색상을 채울 수 있습니다.

public void changeColor() 
{ 
    setColor(10); //for example 
} 
+1

매우 사실이지만 질문은 아닙니까? – KJ3

+0

죄송합니다. 수정했습니다. –

+0

'setColor'와'getColor'는'public' 일 필요는 없습니다. 상황에 더 적절한 경우'protected' 될 수 있습니다. 또한 getter를 사용하는 것이 일반적으로 많은 의미를 갖지만, 이것이 작동하려면 반드시 필요한 것은 아닙니다. 더 깊은 레벨에서'Animal'이'color'를 가졌다면,'Animal'이'IColorChangable'을 구현할 것인가를 고려해 볼 가치가 있습니다. –

1
color = 123; 

는하지만 당신의 속성 색상은 공용 또는 보호로 설정해야합니다.

setColor(color); 
0

그냥 일반 회원으로 액세스 : 당신의 방법으로 호출 한 후

public void setColor(int color){ 
    this.color = color; 
} 

을 그리고 : 그것은 개인의 경우

, 당신은 당신의 동물 클래스에서 세터를 수행해야합니다 :

public void changeColor(int color) 
{ 
    this.color = color; 
} 
+1

OP는'color'의 접근 수준을 보여주지 않기 때문에 이것이 가능한지 알 수 없습니다 ('private' 일 수도 있습니다). 또한 명확성을 위해'@ Override' 태그의 사용을 제안합니다 (Eclipse는 부수적으로 기본값이없는 경우 경고를 생성합니다). –