2017-02-26 3 views
0

그래서 OpenGL/GLE 용 프레임 워크를 설계하고 있습니다.Java 상속 제한 극복 (의견/제안)

"질감"추상 클래스를 만들었습니다. 나는 Texture2D와 TextureCubemap을 Texture로부터 상속 받았습니다. Texture2D에는 RenderTexture가 있고 TextureCubemap에는 RenderTextureCubemap이 있습니다. 이제이 모든 것이 잘 동작하지만 RenderTexture와 RenderTextureCubemap은 많은 공통점을 공유합니다. 나는 그 (것)들 사이 현재 중복을 제거하고 싶으면. 다른 언어에서는 다중 상속을위한 완벽한 위치가되지만 Java는이를 지원하지 않습니다. 두 번째 아이디어는 인터페이스였습니다. 여기서 문제는 인터페이스 메소드에 대한 바디를 정의 할 수 없기 때문에 실제로 이점이 없다는 것입니다. 또 다른 옵션은 "RenderTarget"클래스를 만들고이를 멤버 변수로 추가하는 것입니다.이 방법이 효과가있을 때마다 "RenderTarget"클래스에서 보유한 항목에 액세스하려고 할 때마다 멤버 변수를 뛰어 넘지 않아도됩니다. "그것은 일종의 clunky 보인다.

다른 사람들이 제안 할 수있는 더 세련된 솔루션이 있는지 궁금합니다.

편집 : 다음은 요청 별 다이어그램입니다. enter image description here

+0

몇 가지 클래스 다이어그램의 스크린 샷을 추가 할 수 있습니까? 설명은 괜찮지 만 사진이 더 좋을 것입니다. –

+1

Java 8부터, 인터페이스에는'default' 메소드가있을 수 있습니다. –

+2

@JornVernee 이것이'default'의 올바른 사용 사례가 아닌 것 같습니다. – ajb

답변

0

실제로 Java 8부터는 인터페이스에 메소드 본문을 정의 할 수 있습니다. https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html을 참조하십시오. 따라서 해결책이 될 수 있습니다.

의견에서 제안한대로 중복 코드를 다른 클래스에 넣고 두 렌더러 (즉,이 코드를 소유 한 멤버 변수 만들기)에 모두 작성하는 것이 좋습니다.

여기에 적용 할 수있는 또 다른 가능성은 중복성을 도우미 클래스 (인스턴스화 할 수없고 정적 메서드 만 사용 가능)로 간주하여 2 개의 렌더러에서 정적 메서드를 폴링하는 것입니다.

+0

이 사실이고 잘 작동하지만 안드로이드 용으로 구축 중이며 슬프게도 인터페이스의 기본 메소드는 API 24에서만 지원됩니다.이 코드를 거꾸로 호환 가능하도록 만들어서 이것을 규칙으로 지정합니다. 옵션 아웃. 그러나 나는 동의한다. 일반 자바 응답을 찾는 사람은 누구나이 패를 따라 가야한다. –

+0

코드가 어떻게 보이는지 알지 못하더라도 확실히 도움이되지 않지만 "RendererTarget"변수를 추가하지 않으려는 경우 정적 메서드를 사용하여 도우미 클래스의 중복을 고려해야합니다. 완전한 물건을 나른다.) 이제 다중 상속을 피하기 위해 Java에서 항상 선호되어 왔습니다. 예를 들어이 부재는 다이아몬드 문제를 신경 쓰지 않아도된다는 것을 의미합니다. – Adonis

+0

주의하십시오. 기본 방법은 구현이 아니라 오케스트레이션을 표현하기위한 것입니다. 추상적 인 수업에서 구체적인 방법으로 그들을 대우하는 실수를 저 지르지 마십시오. –