2014-06-15 3 views
2

class Cow ad class Pig이라는 2 개의 클래스가 있다고 가정 해 보겠습니다.구현을 깨지 않고 클래스에 메소드 추가

그들은 둘 다 interface Animal을 구현합니다.

interface의 경우 public void eat()public void speak()이라는 두 가지 방법 만 있습니다.

모두 괜찮습니다. 그러나 이것은 interface을 사용하는 것이 좋지만,이 interface에 메서드를 추가해야한다면 구현이 중단된다는 것을 알았습니다. 즉,이 클래스에서 새 메서드를 구현해야합니다.이 메서드는 " 닫히는 원리 ".

interface 외에도 나는 abstract 클래스를 사용할 것이므로 앞으로 새로운 메소드를 추가해야한다고 생각했습니다. 예 : public class Cow extends ... implements Animal.

좋은 계획 인 것 같아요. 그렇지 않다면 수정하십시오.

하지만 문제는 무엇입니까? 이러한 클래스가 이미 다른 클래스 인 경우 ? 이 경우 2 개의 클래스를 확장 할 수 없습니다.

그래서 제 질문은 :

내가 관련 클래스에 공통의 interface이 하지 않는 미래를 새로운 방법을 추가 할 수있는 기능을 보류하면서 선언 할 수있는 패턴이 있습니까 "닫힌 개방 원칙"을 깨고 구현을 중단하지 않습니까?

+2

Java 8의 [* default methods *] (http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)가 해결하려고하는 문제입니다. –

답변

2

자바 8을 이제 Animaleatspeak를 오버라이드 (override) 할 필요가 있지만, sleep를 오버라이드 (override) 할 수도 있습니다

public interface Animal { 

    void eat(); 
    void speak(); 
    default void sleep(){} 

} 

default methods이 있습니다.

abstract class을 사용하는 Java 사전 Java는 모든 interface 메소드를 구현하지 않아도되는 것을 방지하는 일반적인 방법이었습니다. 언급했듯이 다중 상속에서는 작동하지 않으므로 모든 경우를 해결하는 데 사용할 수 없습니다.

P. interface 메소드 public을 선언하지 마십시오. 모든 interface 멤버의 기본 공개 여부입니다.

+0

응답 해 주셔서 감사합니다. 그래서, 다음에 API 디자이너가 다음 릴리스에서 새로운 메소드를 추가해야 할 때, 클래스를 이미 확장 한 경우 어떻게해야할까요? 이 샘플을 인용 해 주시겠습니까 (Java 8 이전)? 감사. – Unheilig

+0

@Unheilig 예제를 보려면 클래스 ['Number'] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Number)를 참조하십시오.자바), 추상 메소드로 선언 된'intValue'와'longValue', Java 1.1 이후 추가 된'byteValue'와'shortValue'가 구체적인 구현물로 제공됩니다. –

+0

@ GOTO0 감사합니다. 그러나이 경우,'Number'는'interface' 대신에'abstract' 클래스로 선언되며, 구체적인 구현에 의해'abstract' 클래스에서'abstract concrete' 메쏘드를 선언했음을 의미합니까? 그건 이해할 만하다. 그러나 ('Number')가'interface'이고 서브 클래스가 이미 다른 클래스를'extend'한다고 가정한다면, 이것은 효과가 없을 것입니다, 그렇죠? – Unheilig

1

Java 8에서 인터페이스는이 목적으로 default methods을 정의 할 수 있습니다.

관련 문제