데이타스토어는 업데이트시 에러가 나면 오류를 가로체지를 못한다.
가로 채려면 표준데이타스토어를 상속 받은 클래스를 사용 하여 DBerror 이벤트 부분에 처리 부분을 기술 해 주어야만 가능 하다.
이것을 자바의 핸들러 식으로 처리 할 수 없나 하고 알아보다 다형성을 생각 해 보았다.
하지만,
파워빌더는 다중 상속이 되지 않는다.
오로지 단일 상속이다.
더욱 않좋은 것은(?) 강제로 캐스팅도 불가능 하다.
따라서 자바의 implement나 c++의 가상 함수 같은 것은 구현이 불가 하다.
하지만, dynamic이라는 키워드를 사용하여 흉내는 낼 수 있다.
다음의 예를 보자
오브젝트는 아래와 같이 구성 하였다.
application
window w_1
window w_showmsg
w_1는 (none)showmessage(string as_1) 윈도함수를 가지고 있다.
내용은 MessageBox("", as_1) 이 한 줄을 가지고 있다.
w_showmsg도 (none)showmessage(string as_1) 윈도함수를 가지고 있다.
다만 내용은 없다.
아래는 application에 코딩한 내용이다.
1 w_showmsg lw_showmsg
2 w_1 lw_1
3 Open(lw_1, "w_1")
4 lw_showmsg = lw_1
5 lw_showmsg.showmessage("abc")
요렇게 하면 컴파일시에는 오류가 발생하지 않는다.
하지만 실행 하면 4번 줄에서 문제가 발생한다. 오류 내용은 “할당하려고 하지만 타입이 일치 하지 않는다” 이다. 타입이 달라 실행시간에 할당 자체가 허락 되지 않는다.
다음과 같이 바꾸어 보았다.
1 w_showmsg lw_showmsg
2 w_1 lw_1
3 window lw_window
4 Open(lw_1, "w_1")
5 lw_window = lw_1
6 lw_window.showmessage("abc")
이번에는 컴파일 해보면 6번 줄에서 오류가 난다. "Unknown function name:showmessage" 즉 없는 메소드, 아니 함수를 호출 한다 이 소리다.
그럼 어쩌면 될까?
이때 바로 dynamic 키워드를 쓰면 된다.
다음과 같이
1 w_showmsg lw_showmsg
2 w_1 lw_1
3 window lw_window
4 Open(lw_1, "w_1")
5 lw_window = lw_1
6 lw_window.dynamic showmessage("abc")
컴파일도 되고 실행도 잘 된다.
그럼 6번줄에서 showmessage 함수를 살짝 바꾸어 s1howmessage로 하면 어찌 될까?
컴파일은 잘 된다. 실행하면 다음과 같은 메시지가 뜬다.
말 그대로 동적으로 함수를 호출 하려 하였으나 해당 함수가 없다. 고로 참조나 잘못 된게 없나 찾아 봐라 이소리다.
dynamic과 try 구문을 이용하면 다형성을 조금이나마 흉내 낼수 있지 않을까 생각 해 본다.