CLASS lcl_database DEFINITION CREATE PRIVATE. PUBLIC SECTION. CLASS-METHODS: get_instance RETURNING VALUE(ro_inst) TYPE REF TO lcl_database. PRIVATE SECTION. CLASS-DATA: mo_instance TYPE REF TO lcl_database. METHODS: constructor. ENDCLASS.
CLASS lcl_database IMPLEMENTATION. METHOD get_instance. IF mo_instance IS NOT BOUND. CREATE OBJECT mo_instance. ENDIF. ro_inst = mo_instance. ENDMETHOD. METHOD constructor. " 初始化 ENDMETHOD. ENDCLASS.
CLASS lcl_vehicle_factory DEFINITION. PUBLIC SECTION. METHODS: create_vehicle IMPORTING !iv_type TYPE string RETURNING VALUE(ro_veh) TYPE REF TO lcl_vehicle. ENDCLASS.
CLASS lcl_vehicle_factory IMPLEMENTATION. METHOD create_vehicle. CASE iv_type. WHEN 'CAR'. ro_veh = NEW lcl_car( ). WHEN 'TRUCK'. ro_veh = NEW lcl_truck( ). WHEN 'BUS'. ro_veh = NEW lcl_bus( ). ENDCASE. ENDMETHOD. ENDCLASS.
CLASS lcl_vehicle DEFINITION FRIENDS lcl_vehicle_factory. PRIVATE SECTION. DATA: mv_serial TYPE string. ENDCLASS.
友元规则
规则
说明
单向
A FRIENDS B → B可访问A的私有组件,反之不行
不继承
友元关系不传递给子类
可在定义时指定
CLASS ... DEFINITION FRIENDS friend_class.
⚠️友元是封装的例外
友元破坏了封装原则,应谨慎使用。仅在确实需要时使用(如工厂模式、测试类)。
导航方法 (Navigation Method)
返回关联对象引用的方法:
1 2 3 4 5 6 7 8
CLASS lcl_rental DEFINITION. PUBLIC SECTION. METHODS: get_vehicle IMPORTING !iv_index TYPE i RETURNING VALUE(ro_veh) TYPE REF TO lcl_vehicle. PRIVATE SECTION. DATA: mt_vehicles TYPE TABLE OF REF TO lcl_vehicle. ENDCLASS.