안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당 임펠리테리입니다.
말씀하신대로, TGraphicControl이나 TCustomControl의 Canvas 프로퍼티는 protected
로 선언되어 있습니다. 그러니까, 이들 두 컨트롤 클래스에서는 직접 Canvas를 억세
스할 수 없죠. 하지만.. 이 두 클래스는 추상클래스이기 때문에, 어차피 그대로는
사용할 수 없는 것입니다. 예를 들어서,
TCustomControl *MyControl = new TCustomControl(this);
라고 코딩한후 컴파일하면 에러가 날겁니다.
여기서, 어느정도 C++문법을 이해하셔야 하는데, 추상클래스는, 적어도 하나의
순수 가상함수를 가지고 있는 클래스를 말합니다. 여기서 순수 가상함수란,
virtual로 선언해놓은 프로토타입만 존재하고, 그 함수의 바디는 없는 함수를
말하죠. 이렇게 바디가 없는 함수를 선언할 수 있는 이유는, virtual 키워드는
지연바인딩을 지시하는 키워드이기 때문에 컴파일타임에서는 그 바디가 같은
클래스에 존재하든 그렇지 않든 찾아보지 않기 때문입니다. (virtual 함수의
바인딩, 즉 함수의 호출과 호출된 함수의 바디를 연결하는 작업은 런타임에
이루어집니다.)
이렇게 그 클래스 내에 바디가 존재하지 않는 함수의 선언이 클래스 내에 존재할
경우 그 클래스는 추상클래스라고 하며, 그 자체로서 객체를 생성할 수 없습니다.
이런 추상클래스는 반드시 상속받은 클래스에서 바디가 없는 함수를 모두
바디를 추가하여 새로 선언해줘야만 사용가능한거죠. 다시말해서, 상속단계에서만
의미가 있고, 실제로 그 클래스로 객체를 생성할 수 없습니다.
위에서 말한 두 추상클래스의 경우, 멤버중 몇개의 메소드가 추상적으로, 그러니까
바디가 없는 상태로 선언되어 있습니다. 예를 들면, TCustomControl::Paint()
메소드가 그런데, 이렇게 Paint 메소드가 추상적으로 선언된 이유는, 어떤 모양의
컨트롤을 만들지 알수가 없는 상태이므로 그 모양을 그리게 될 Paint 메소드의
바디를 미리 만들어놓을 수가 없는거겠죠?
그러므로, TCustomControl이나 TGraphicControl은 반드시 상속을 받아서 사용하게
되고, 이 상속을 받은 클래스에서 Canvas 프로퍼티를 public으로 재 선언해서
사용하는 것입니다.
그럼 참고하시길...
임펠리테리 박지훈이었습니다.
(cbuilder, cbuilder@thrunet.com)
|