您好,欢迎访问三七文档
ABAP面向对象编程一.介绍二.主要概念三.使用Control四.ALVControl例子一.介绍传统的ABAP面向过程编程SAPAG1999ProceduralProgrammingDataDataDataDataDataDataDataDataDataDataFunctionsaredefinedindependentlyofdatastructuresDirectaccesstodataFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunctionFunction面向对象编程SAPAG1999HistoryofProgrammingLanguagesMachinelanguageAssemblerJavaC++ABAPObjectsABAPABAPObjects是ABAP的扩展,集合了Java,C++,Smalltalk等语言的特点。和原来的ABAP无缝集成。Class在SAP中,可以在SE24或ABAP编辑器中定义Class。二者的区别类似SE11中定义的结构与程序中定义的结构。在SE24中,可以看到类的各个部件,条理清楚。代码中的关键字,如public,class-method等在SE24中都可以体现出来。二.主要概念Class:分两部分定义。Class中不能再嵌套定义Class。SAPAG1999CLASSclassnameDEFINITION.ENDCLASS.CLASSclassnameIMPLEMENTATION.ENDCLASS.TheClassasaBlueprintforObjectsDefinitionpartTheclasscomponents(forexample,attributesandmethods)aredefinedinthispart.DefinitionpartTheclasscomponents(forexample,attributesandmethods)aredefinedinthispart.ImplementationpartThispartonlycontainsthemethodimplementations.ImplementationpartThispartonlycontainsthemethodimplementations.在ABAP编辑器中定义Class定义Class的一个例子ObjectsObject:就是class的实例(instance)使用object前,先要用下面的语句来定义该object属于哪个类dataobjectnametypereftoclassname定义完该对象后,就可以使用createobjectobjectname来创建对象了。这时系统会分配一块内存区域给对象。createobject时,在内存中分配一个空间给该Object。如果内存中某个object区域不被指向,系统将释放这部分内存。下图中对两个object使用等号之后,它们指向同一个内存地址,同时释放一个object所占用的内存。可以使用TYPETABLEOFREFTOclass关键字定义一个内表,来存放该类的多个对象。可以是各种类型,包括:Datatypes:scalar(例如dataelement),structured,intables,ABAPelementarytypes(C,I,...)ObjectreferencesInterfacereferencesAttribute按定义位置,分为Public和Private.PublicAttribute:能从class外直接访问和修改。一般来说,尽量少定义PublicAttribute。PrivateAttribute:只能从类中访问和修改。按定义的关键字,分为Instance和Static.InstanceAttribute:同一个类中多个实例的InstanceAttribute各自分开,具有不同的值。使用DATA关键字定义。用法:实例名-属性StaticAttribute:同一个类中多个实例的StaticAttribute的值一样。可以通过各个实例或直接通过类来访问和修改。使用CLASS-DATA定义。在debug时可以看到class-data不占用object的内存。用法:实例名-属性或类名=属性Method按定义位置,分为Public和Private.类似Attribute。PublicMethod:能从类外调用。PrivateMethod:只能从该类中调用。按定义的关键字,分为Instance和Static.InstanceMethod:能使用static和instance的内容。使用Method定义。用法:实例名-方法名StaticMethod:只能使用static的内容。可以不通过实例,直接调用。使用Class-Method定义。用法:实例名-方法名或类名=方法名Method的参数Method的参数可以是Class/Object可以有importing,exporting,changing,returning等Constructor方法(初始化)每个类都自动隐性带有名为constructor(Instance)和class_constructor(Static)方法。要使用这两个method,必需首先定义它们。constructor可以有参数和例外,而class_constructor没有参数。每次使用createobject时自动执行constructor方法.Class-constructor在一个程序中只执行一次。在以下事件前自动执行。CREATEOBJECT调用该类的属性使用CallMethodRegisteringastaticeventhandlerRegisteringanevetmhandlermethodforastaticevent如果constructor带有参数,在createobject时就能够通过传入的参数初始化object。例如CREATEOBJECTairplane1exportingp2_name='Hansemand'p2_planetype='Boing747'.Protectedprotectedsector中的内容用可以被该类自己,其父类和子类访问。继承可以有多级继承一个子类只有一个直接父类类知道自己的superclass,但不知道自己的subclass继承时,superclass的内容不能除去,只能加入新的内容用法:定义class时,使用关键字INHERITINGFROMSAPAG1999CLASSlcl_airplaneDEFINITION.PUBLICSECTION.METHODSget_nameRETURNINGVALUE(re_name)TYPEstring.PROTECTEDSECTION.DATAtankTYPEREFTOlcl_tank.PRIVATESECTION.DATAnameTYPEstring.ENDCLASS.lcl_airplane#tank:lcl_tank-name:string+get_name():string+public#protected-privateInheritanceandVisibilityPubliccomponentsVisibletoallDirectaccessProtectedcomponentsOnlyvisiblewithintheirclassandwithinthesubclassPrivatecomponentsOnlyvisiblewithintheclassNoaccessfromoutsidetheclass,notevenfromthesubclassInterfaceSAPAG1999DefiningandImplementinganInterfaceINTERFACElif_document.DATA:authorTYPEREFTOlcl_author.METHODS:print,display.ENDINTERFACE.CLASSlcl_text_documentDEFINITION.PUBLICSECTION.INTERFACESlif_document.METHODS:display.ENDCLASS.CLASSlcl_text_documentIMPLEMENTATION.METHODlif_document~print.ENDMETHOD.METHODlif_document~display.ENDMETHOD.METHODdisplay.ENDMETHOD.ENDCLASS.InterfaceonlyhasadeclarationAninterfacecorrespondstoanabstractclassthatonlycontainsabstractmethodsInterfacesareimplementedinclassesInterfacesdonothavevisibilitysections接口中只有定义。要完成的功能在class的implementation部分实现。接口中的部件自动在类中可用。接口不分为public,private等部分。属性、方法、常量、类型等可以和类中的一样定义接口需要在类定义的public部分列出。用法:interfacename~componentname可以使用TYPETABLEOFREFTOinterface关键字定义一个内表,来存放属于不同类的对象。这些类必须都包含这个接口。EventsEvents类似一个类,有自己的属性和方法,能被其它某一个类调用。Event只能有EXPORTING参数要使用Events,需要以下几点。1.在class中定义events,和它的触发条件(events,raise)2.定义events,以及它实现的功能(methodxxxforeventofclassname)3.使用包含events的object前,对event对象使用createobject,并且用sethandler语句,使event能够被响应。三.使用Control(控件)在对屏幕的编程中,常常使用Control技术,能够实现如VC,Java等语言的一些功能,如Event,Attribute等。方便用户和系统交互。常见的Control:TextEdit,ALV,Picture,HTMLviewer等使用Control前,我们要先在屏幕上创建一个Container控件。Control在这个控件中显示、处理。做一个RichText控件的例子1.创建控件创建完container后,就可以在程序中,调用系统自带的class了。这里需要用到两个class:cl_gui_custom_containercl_gui_textedit创建object的时候,传入container的名字做参数,并传入是否自动换行等参数(这些参数,是传到constructor方法的)效果如图,可以看到是一个空白的控件,并自带了一些按钮。控件的大小和位置与container一致。2.使用cl_gui_textedit的其它功能可以调用该类中的方法,如SET_FOCUS,GET_VISIBLE等,来完成其它面向语言中的一些常见功能。通过类中的event,可以实现和用户的交互。可以自己定义handler,来响应用户的events。由于操作control的方法都是通过RFC函数传到front-end实现的,因此要使用FLUSH方法来保持front-end和后台
本文标题:SAP-ABAP
链接地址:https://www.777doc.com/doc-12101 .html