2011-08-05 3 views
0

내가 클래스가 말해봐. 클래스 A와 클래스 B를 랩핑하여 myA와 myB를 얻고 싶습니다. 이제 외부에서 A 클래스와 B 클래스에 액세스 할 수 없어야하지만 myA 및 myB와 동일한 기능을 사용할 수 있습니다. foo()는 타사 모듈에서 호출 할 수 있습니다.래퍼 디자인 패턴

캡슐화가 아닌 상속을 사용하여이 작업을 수행하는 것이 좋습니다.

그래서이 문제가 있습니다 : A- 호출

  1. > myFoo는() (때문에 동일한 서명 및 다른 반환 형식의 방법을 이름을 변경해야합니다)() 경우 :: foo에 전화해야 타입의 IS myA.
  2. a가 클래스 myA2 :: myA 인 경우 a-> myFoo()를 호출하면 myA2 :: myFoo()를 호출해야합니다.

우아하게하는 방법에 대한 제안 사항이 있으십니까? 나는 몇 가지 해결책을 생각해 냈지만 나는 전체적인 관점에서 신선한 관점을 선호한다.

편집 :

그냥 이론적 인 질문입니다. 나는 실제로 이것을 할 필요가 없으며, 그것이 성취 될 수있는 방법을 생각하고 있습니다.

EDIT2 :

myA2는 myA를 확장하는 클래스입니다. 패턴이 나오기 전에는 A2 (제 3 자 모듈에서 클래스 A를 확장 한 클래스)라고 불렸을 것이다.

+3

명시된 환경 설정에도 불구하고 캡슐화를 사용해야하며 상속하지 않아야합니다. 캡슐화를 사용하면 타사 라이브러리의 모든 종속성을 격리 할 수 ​​있습니다. – antlersoft

+0

이론적 인 질문입니다. –

+1

Luchian :'myA'는'A'와'myB'를'B'로 둘러 쌉니다 만,'myA2'는 무엇입니까? – Nawaz

답변

2

캡슐화 대신 상속을 사용하는 이유를 이해하지 못합니다. 일반적으로 래핑하는 클래스를 확장하는 것은 래퍼 패턴을 구현하는 "잘못된"방법입니다. 특히 일반적으로 프로세스의 인터페이스를 다시 정의하려는 경우가 그렇습니다. myA 클래스에는 A 클래스의 인스턴스를 포함하는 A 유형의 필드가 있으며, myA의 메소드는 필요에 따라 호출 할 수 있습니다. 내가 성취하려는 것을 오해하지 않았다면, 이것은 당신이 원하는 것을 성취하는 가장 우아한 방법입니다.

+0

알아요,하지만 캡슐화하지 않고 가장 우아한 방법을 찾고 있어요. 순전히 이론적 인 ... –

+1

@ 루치아 그 리그 왜 이론적 인 질문이라 할지라도 최선의 접근법을 고의적으로 배제합니까? –

+0

그래서 구성보다 명백히 나쁜 래퍼 패턴을 구현하는 방법을 모색하고 있습니까? 음, 알았어. –

0

마찬가지로 함수 이름/매개 변수를 선언 할 수 있어야합니다. 체크 아웃 : strange-inheritance 섹션 : [23.9] 무슨 의미인가요, 경고 : Derived::f(char)Base::f(double)을 숨 깁니다. 세 번째 코드 블록에.

또한 기본 메서드를 호출하는 구문을 보여줍니다.

+1

그건 적용되지 않습니다. 이 경우 매개 변수가 다릅니다. 필자의 경우 반환 유형이 다릅니다. 컴파일러는 경고가 아닌 오류를 발생시킵니다. –

+0

더 자세히 읽으십시오. 세 번째 코드 블록은 동일한 매개 변수/함수 이름을 다시 정의하고 기본 구문을 사용하여 함수의 기본 버전을 호출합니다. 그래서 당신이 묻는 것처럼 인터페이스 뒤에 숨어 있습니다. –

+0

하지만 그건 가상의 기능이 아닙니다. 귀하의 컴파일러에서 시도해보십시오 ... –