subclass에서 superclass의 멤버 변수의 일부를 사용 금지시킬 수 있나요?
안녕하세요. C++이나 Java나 아무 OOP 언어에서요.
부모로부터 상속받은 멤버 변수 중 일부를 사용 금지할 수 있는 방법이 있나요?
제가 superclass를 하나 만들고 나서 상속받는 subclass를 여러 개 만들려고 합니다.
class superclass {
public:
int i, j;
};
class subclass1 : public superclass {
public:
...
}
class subclass2 : public superclass {
public:
...
}
이런 식으로요. 이 여러 개의 subclass 중에서 딱 한 개, subclass1에서만 i를 사용 금지시키는 방법이 없을까요?
subclass1에서는 i를 사용할 일이 없습니다.
그렇다고 superclass에서 i를 빼버리자니 제가 생각할 수 있는 방법은
1) 나머지 수많은 subclass2, subclass3, ...에 모두 i를 멤버 변수로 넣거나
2) superclass를 2개를 만들어야 하는데 (i만 가진 것과, i를 상속받아서 j를 추가한 것)
인데, 둘다 마음에 들지 않네요.
그나마 2)가 1)보다는 나아보이는데요.
하지만 나중에 디자인이 변경되어서 subclass1에서 i가 아닌 j를 사용금지하게 될 일도 있거든요.
그럴 때는 subclass1뿐만 아니라 superclass도 다 고쳐야해서 2)도 마음에 들지 않네요.
어떤 방법이 가능할까요?
답변
1. 멤버 변수를 직접 이용하지 말고 멤버 변수에 대한 접근자를 정의하면 어떨까 합니다.
다만 이렇게 만들면 Base 포인터로 해당 멤버를 가리키는 경우는 컴파일 중에는 검출하지 못합니다.
런타임에 dynamic_cast로야 겨우 가능할 것 같네요.
저는 이렇게 생각했습니다.
질문자께서 요구하시는 것은..
sub1 is not super.
sub2 is super.
입니다. 즉, 요구하시는 것은 상속의 기본 원칙(철학)을 어긴다고 생각되네요.
차라리
관계를 만드는건 어떤지요
댓글 달기