인터페이스 구현 은닉화 질문입니다.

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

인터페이스 구현 은닉화 질문입니다.

Post by 비회원 »

포트폴리오겸 빠른 컨텐츠제작을 위해서 렌더링+프레임워크엔진을 만들어보고 있는데,
공개엔진 중 일리히트의 방식과 유사하게 만들어보고 싶은 욕심이 있습니다.


일리히트의 경우 헤더에 보면 죄다 인터페이스로 도배되어있더군요.
그말인즉 추측해보면 실제로 구현은 인터페이스를 상속받은 클래스가 처리할텐데요.
상속받은 클래스가 도무지 어디에 있는지 보이지 않습니다. 왠지 그런부분들이 매력있더군요.
이런식으로 구현하기 위해선 어떤 방법이 필요할까요?

대충 생각을 해봤는데,
헤더에 인터페이스 작성 후 엔진의 소스에(배포시에는 공개되지 않는) 상속받은 구현 클래스 작성.
그후에 컴파일해보니 엔진자체는 잘 컴파일이 되었습니다만,

이를 라이브러리로 가져다쓰는 인터페이스에서
상속받은 구현클래스의 생성자가 없다고 컴파일에러가 뜨더군요.
제가 한게 잘못된걸까요?

어떤식으로 해야 괜춘한 은닉이 될지 답변부탁드립니다.
비회원

Post by 비회원 »

음... 제가 질문을 제대로 이해한 것인지는 모르겠으나, + 일리히트 소스는 보지 못하였으나 아는 한도내에서 답변 드리겠습니다. (Ogre 엔진은 살짝 살펴보았고, 현재 저도 비슷한 방식으로 구현 중입니다.)

기본적으로 Application + DLL 로 구성되어 있다고 보시면 될겁니다. (아마도...)
Application 은 단순히 말씀하신 인터페이스만 알고 있습니다.
class MyEngine 이라고 하죠.
이건 MyEngine Engine; 처럼 객체를 생성하지 못합니다. 대신
MyEngine *Engine; 로 사용할 수는 있죠.
(물론 MyEngine *Engine = new Engine(); 도 안됩니다. 객체 생성 자체가 안됩니다.)

DLL 등에서 이것을 처리 해줄 수가 있습니다. 방법은 여러가지구요.
결국은 상속 받은 엔진을 사용해서 객체를 만들게 됩니다. 즉,
MyEngine *Engine = (*Engine)new MyEngineImplementation();

그런데 이렇게 하면 말씀하신 은닉이 별 소용이 없죠.
원한다면 DLL 파일에서 new 를 해서 얻어 올 수 있습니다. 즉,
MyEngine *Engine = GET_ENGINE_FROM_DLL();
GET_ENGINE_FROM_DLL 는 DLL 에서 얻은 함수 포인터를 사용한 함수입니다. (예를 들은 방법입니다.)

이렇게 되면 Application 은 class MyEngineImplementation 에 대해서 모르게 됩니다.
결국 모든 멤버 함수 호출은 virtual 을 통한 MyEngineImplementation 의 함수를 호출하게 되구요.

다 아시는건 아닌가 걱정되고, 궁금하신게 이게 맞는지 궁금하군요.
비회원

Post by 비회원 »

우선 계속시도하던 방법으로 해결했습니다만 저런 방법이 있다는걸 알게되었네요.
답변주셔서 감사합니다.

참고로 제가 시도한방법은 객체들을 상속하는 인터페이스만 공개하는 방법으로 해결을 했습니다~
인터페이스 명세 헤더, 실제 객체 헤더로 구성하고 소스에서는 양쪽을 다 불러와서 구현합니다.
그 후에 배포시에는 인터페이스 헤더와 컴파일된 Lib만 공개하니까 유저단에서는 수정을 하질 못하더군요.
실제 멤버에 대해서도 모르구요. 우선 이정도 선에서 만족할까 합니다.
tomatowax
Posts: 464
Joined: 2005-01-17 12:22
Contact:

Post by tomatowax »

비회원 wrote:우선 계속시도하던 방법으로 해결했습니다만 저런 방법이 있다는걸 알게되었네요.
답변주셔서 감사합니다.

참고로 제가 시도한방법은 객체들을 상속하는 인터페이스만 공개하는 방법으로 해결을 했습니다~
인터페이스 명세 헤더, 실제 객체 헤더로 구성하고 소스에서는 양쪽을 다 불러와서 구현합니다.
그 후에 배포시에는 인터페이스 헤더와 컴파일된 Lib만 공개하니까 유저단에서는 수정을 하질 못하더군요.
실제 멤버에 대해서도 모르구요. 우선 이정도 선에서 만족할까 합니다.
이미 해결을 하셨다니 굳이 덧붙일 필요는 없겠지만 한 번 클래스를 작성하여 보았습니다.
실제로 저희 라이브러리 중에서도 같은 방법으로 은닉화를 구성하기도 합니다.
물론 아주 특수한 경우를 제외하고는 은닉화는 사용하고 있지 않습니다.
(현재는 D3D 객체들과 동일한 Interface 가 필요한 Driver 같은 경우에만 사용)

Image
http://www.mindpol.com/Plugins/Technolo ... ?f=36&t=12
Locked