20091012 - 짠
VEHICLE
△
┌-----┼-----┐
| | |
car bus truck
저번주에 상속을 배웠으니...
예제 car를 가지고 설명중...
* redefinition = JAVA : Override ( polymophim)
* 상속받은 부모의 method를 가공할 수 있다.
인자들을 못 바꾸고. Logic만 수정하는 개념.
* Supper Class의 Method를 꼭 호출하지 않아도 됨.
METHOD get_average_fuel.
re_fuel = super->get_average_fuel( im_distance = im_distance
im_fuel = im_fuel ) + 2.
*CALL METHOD SUPER->GET_AVERAGE_FUEL
* EXPORTING
* IM_DISTANCE = IM_distance
* IM_FUEL = im_fuel
* RECEIVING
* RE_FUEL = re_fuel
* .
ENDMETHOD.
*
Overloading.
- 인자수를 변경할 수 있다.
- logic을 수정할 수 있다.
- SuperClass Construct를 꼭 호출 해야 한다.
constructor 버튼을 눌러서 창이 나오면
parameter를 누른다음 im_color 을 정의한다.
그 후 color = im_color 로 만든다.
METHOD constructor.
CALL METHOD super->constructor
EXPORTING
im_make = im_make.
color = im_color.
ENDMETHOD.
Static Components and Inheritance
1. A class that defines a public or protected static attribute shares this attribute with all its subclasses
2. Static method cannot be redefined
106page
Up-Cast = Narrowing Casting...
부모 클래스에 자식 클래스의 주소를 넘기면...
부모는 상속 해준 Attribute 와 method 에 대해서만
Pointing 하게 된다.
redefinition 한 method 에 대해서는... 자식의 로직을
실행하게 된다.
예제
DATA: r_veh TYPE REF TO zcl08_kdn_vehicle,
r_car TYPE REF TO zcl08_kdn_car,
r_bus TYPE REF TO zcl08_kdn_bus,
r_truck TYPE REF TO zcl08_kdn_truck,
r_tab TYPE TABLE OF REF TO zcl08_kdn_vehicle.
DATA: car_avg_fuel TYPE i,
bus_avg_fuel TYPE i,
truck_avg_fuel TYPE i,
veh_avg_fuel TYPE i."s_consum.
CREATE OBJECT: r_car , r_bus , r_truck.
r_veh = r_car.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : 'car:',veh_avg_fuel.
r_veh = r_bus.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : 'bus:',veh_avg_fuel.
r_veh = r_truck.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : 'truck:',veh_avg_fuel.
r_veh = r_car.
APPEND r_veh TO r_tab.
r_veh = r_bus.
APPEND r_veh TO r_tab.
r_veh = r_truck.
APPEND r_veh TO r_tab.
LOOP AT r_tab INTO r_veh.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : / veh_avg_fuel.
ENDLOOP.
사용은 같은 internal Table 은 배열 같아서 같은 형식의 여러개의 데이터가 입력 되는 형식이다.
ㅋㅋㅋ 조금뒤에 더...
Polymorphism 의 조건. (method기준)
1. Inheritance
2. Redefinition.
3. Up-Cast(Narrowing Cast).
LOOP AT r_tab INTO r_veh.
IF sy-tabix = 1.
r_car ?= r_veh.
r_car->get_color( ).
ENDIF.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : / veh_avg_fuel.
ENDLOOP.
down Cast (widening Cast)
A ?= B. 라는 형식으로 ...
LOOP AT r_tab INTO r_veh.
TRY .
CASE sy-tabix.
WHEN 1.
r_car ?= r_veh.
r_car->get_color( ).
WHEN 3.
r_truck ?= r_veh.
r_truck->get_cargo( ).
WHEN 4.
r_truck ?= r_veh.
r_truck->get_cargo( ).
WHEN OTHERS.
ENDCASE.
CATCH cx_sy_move_cast_error.
MESSAGE i004(z08_kdn) WITH 'itab' sy-tabix.
ENDTRY.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : / veh_avg_fuel.
ENDLOOP.
interface 시작..
Interface 안에는 .. Implementation 을 할 수 없다.
상속 (uses) class 안에서 해당 I/F 의 mothod를 implemention 한다.
compound Interface.~
interface 에서 interface 를 부르는 것을 두고 하는 말....
Z08_KDN_TT 이녀석을 이용해서 테스트 함 해보자.
DATA: r_car TYPE REF TO zcl08_kdn_car.
DATA: r_bus TYPE REF TO zcl08_kdn_bus.
DATA: r_truck TYPE REF TO zcl08_kdn_truck.
DATA: r_rental TYPE REF TO zcl08_kdn_rental.
START-OF-SELECTION.
CREATE OBJECT : r_car , r_bus, r_truck.
CREATE OBJECT : r_rental.
r_rental->add_vehicle( r_car ).
r_rental->add_vehicle( r_truck ).
r_rental->add_vehicle( r_bus ).
r_rental->get_vehicle( ).
METHOD add_vehicle.
APPEND im_vehicle TO vehicle_list.
ENDMETHOD.
짜잔...
zcl_vehicle - trigger
1. EVENT : VEHICLE_CREATED 라는 이벤트를 생성할 것이다.
2. Rase - Constructor(car/bus/truck 영향)
3. add_vehicle 이 실행..됨
constructor 에
setHandler add_vehicle for acc Instances