2008-10-15 5 views
2

Java에서 파생 클래스의 인터페이스를 구현할 수 있습니까?

public class ParentClass implements SomeInterface { 
} 

public class ChildClass extends ParentClass { 
} 

ParentClass parent; 
ChildClass child; 

그러면 다음과 같은 TRUE 문이 생깁니다.

(parent instanceof SomeInterface) == true 
(child instanceof SomeInterface) == true 

SomeInterface를 구현할 수 있습니까? ChildClass에서 instanceof 연산자로 확인할 때 false를 반환합니까?

가능하지 않은 경우 해결 방법이 있습니까?

답변

18

아니요, 그렇게하려는 의도는 클래스 계층 구조에 결함이 있음을 나타내는 좋은 힌트입니다.

해결 방법 : 클래스 계층 구조를 변경하십시오 (예 : 같은 : 대신 상속의

어쩌면
interface SomeInterface {} 
abstract class AbstractParentClass {} 
class ParentClass extends AbstractParentClass implements SomeInterface {} 
class ChildClass extends AbstractParentClass {} 
2

ChildClass와 ParentClass 간의 묵시적인 IS-A 관계를 위반할 수 있습니다. 왜 이걸하고 싶어?

-1

아마도 더 나은 해결책이 고안 될 수있는 특별한 경우가있을 수 있지만 일반적인 경우에는 흑 마술이 필요합니다. 결국 Javassist은 개체를 "해킹"하는 데 사용할 수 있지만 확실하지는 않습니다.

2

"구현하지 못했습니다"라고 생각하지만 부모 클래스의 인스턴스인지 확인할 수 있습니다. 인터페이스가 너의 것입니까? 그렇다면 클래스를 확장하여 의미가있는 "IsObjectDerived"메소드를 포함하면 클래스가 객체에서만 파생 될 경우 true를 반환합니다. 당신이 클래스를 작성하고 있기 때문에, 부모 클래스에 그것을 구현하고 객체가 클래스 Parent라면 true를 리턴하고 그렇지 않으면 거짓을 리턴해야한다.

또한 현재 클래스의 수퍼 클래스를 확인하여 리플렉션을 통해이를 수행 할 수 있으며이 클래스가 객체인지 확인할 수 있습니다. 클래스를 구현할 수 없기 때문에 아마 이런 식으로 할 것입니다. 내가 발견 한 자바 리플렉션에서 tutorial을보고 싶을 수도 있습니다.

[편집] 일반적으로 나는 이것이 합리적인 설계에서 불필요하다고 생각하지만 그렇게 할 수 있습니다.

0

나는이 문제를 인터페이스 및 클래스 디자인에 결함이 있음을 분명히 나타낼 수 있어야한다고 생각합니다. 비록 당신이 자바로 그것을 할 수 있다고하더라도 (그리고 나는 당신이 할 수 있다고 생각하지 않습니다)해서는 안됩니다.

ChildClass에서 원하는 것과 별도의 SomeInterface 구현을 가지도록 ParentClass를 다시 고려하는 방법은 어떻습니까? 어쩌면 ParentClass 및 ChildClass에 대한 공통 기본 클래스가 필요할 수도 있습니다.

7

구성이 구성원으로 "기본 클래스"개체가 단지 회원에게 필요한 방법을 전달, 당신이 필요로하는 인터페이스를 구현, 즉 원하는 것입니다.

0

나는 이것이 어떻게 건전한 연습이 될지 모르지만, 은 Shigeru Chiba가 만든 우수한 패키지 Javassist를 사용하여 클래스를 동적으로 변경할 수 있습니다. 이를 사용하여 클래스에서 기능을 추가 및 제거한 다음 클래스 파일로 저장하지 않고 이러한 클래스의 인스턴스를 사용할 수 있습니다.

역동적이고 흥미롭고 누구에게나 혼란 스럽습니다. 조심스럽게 사용하면 내 충고가되지만 내 의견으로는 더 나은 프로그래머가되기 때문에 주변에서 놀아 라.

(ASM은 비슷한 방식으로 작동하지만 지금까지 시도하지는 않았지만 JVM에서 작업하는 비 자바 언어 제작자들 사이에서 인기가있는 것으로 보입니다.)

3

Java에서 가능하지 않은 다른 답변에 동의합니다.

기타 답변은 디자인에 결함이 있음을 보여줍니다.

나는 그것들에 동의하지만, 저명한 OO 전문가 (특히 Bertrand Meyer)는 우리와 동의하지 않으며 그러한 디자인이 허용되어야한다고 지적하는 것이 공평합니다.

다른 OO 상속 모델 (특히 Meyer 's Eiffel 프로그래밍 언어)은 찾고있는 "가용성 또는 유형 변경"(CAT) 기능을 지원합니다.

1

OOP 다형성의 기초가되는 상속 관계는 is-A 관계를 나타냅니다. 질문은 "is"관계가 "is not"관계로 재정의하는 방법을 요청하는 것처럼 보입니다.

그건 작동하지 않습니다.

객체 지향 텍스트 또는 온라인 자료의 입문서로 돌아가서 다형성, 캡슐화 및 신원을 나타내는 객체 지향적 의미를 연구합니다.

  1. 정체성을 없애고 COM/ActiveX 및 도난 된 자격 증명을 얻었습니다.
  2. 캡슐화를 제거하고 아무도 안전하지 않습니다.
  3. 폴리 피즘의 유형 규칙을 없애고 기본적으로 그것이 무엇인지 반드시 말해야합니다.

그런 상황을 원하면 "C"로 프로그램하십시오. OOP 언어 기능을 사용하여 OOP 코드를 쓰는 척하면서 어지럽히 지 마십시오. 구조체를 사용하여 데이터를 보관하십시오. 어디 에나 노조를 배치하십시오. 포기와 함께 타입 변환을 사용하십시오.

프로그램이 안정적으로 작동하지 않을 수 있지만 Java 및 C++와 같은 모든 제한 언어를 사용하면 프로그램을 더욱 안정적이고 읽기 쉽고 쉽게 작성하고 수정할 수 있습니다.

SmalTalk 또는 Python과 같은 동적 프로그래밍 언어에서 런타임시 나비로부터 날개를 제거 할 수 있습니다. 그러나 개체의 유형을 변경/손상시키는 것만으로

이렇게하면 아무 것도 사지 않습니다. 코딩/디자인 기술과 디자인 패턴이 있습니다.이 패턴을 사용하면 비슷한 "좋은"결과를 얻을 수 있습니다.

응용 프로그램에서 정확히 무엇을 하려는지 생각한 다음 사운드 기술을 사용하여 가장 안전하고 간단한 방법을 찾는 것이 좋습니다.

관련 문제