工作生活与爱好

工作中的记录; 生活中的记忆; 业余爱好的记载。

2007-01-16

 

To Use BADI - Business Add In you need to Understand ABAP OO Interface Concept

Report Z_CTRY.

* A Shape Interface "Like a shape" "Behaves like a Shape"
Adverb/Adjective

Interface IShape.
Methods: getArea Returning Value(area) Type F,
getCircumference Returning Value(circumference) Type F.
Endinterface.

* A Circle Class that behaves like a Shape
Class CCircle Definition.

Public Section.

Interfaces IShape.

Aliases: getArea For IShape~getArea,
getCircumference For IShape~getCircumference.

Methods: Constructor Importing pRadius Type F,
setRadius Importing pRadius Type F,
getRadius Returning Value(pRadius) Type F.

Private Section.
Data radius Type F.
Constants PI Type F Value '3.141592365359'.
EndClass.

Class CCircle Implementation.

Method Constructor.
radius = pRadius.
EndMethod.

Method setRadius.
radius = pRadius.
EndMethod.

Method getRadius.
pRadius = radius.
EndMethod.

Method IShape~getArea.
Compute area = 2 * PI * radius.
EndMethod.

Method IShape~getCircumference.
Compute circumference = PI * radius * radius.
EndMethod.

EndClass.

* A Square Class
Class CSquare Definition.

Public Section.

Interfaces IShape.

Aliases: getArea For IShape~getArea,
getCircumference For IShape~getCircumference.

Methods: Constructor Importing pSide Type F.

Private Section.
Data side Type F.
EndClass.

Class CSquare Implementation.

Method Constructor.
side = pSide.
EndMethod.

Method IShape~getArea.
Compute area = side * side.
EndMethod.

Method IShape~getCircumference.
Compute circumference = 4 * side.
EndMethod.

EndClass.

* A Rectangle Class
Class CRectangle Definition.

Public Section.

Interfaces IShape.

Aliases: getArea For IShape~getArea,
getCircumference For IShape~getCircumference.

Methods: Constructor Importing pHeight Type F
pLength Type F.

Private Section.
Data: height Type F,
length Type F.
EndClass.

Class CRectangle Implementation.

Method Constructor.
height = pHeight.
length = pLength.
EndMethod.

Method IShape~getArea.
Compute area = height * length.
EndMethod.

Method IShape~getCircumference.
Compute circumference = 2 * ( height + length ).
EndMethod.

EndClass.

* START of PROGRAM

* Array of Shapes
Data: OneShape Type Ref To IShape, " One Object with
Shape Behaviour
ShapeTable Type Table Of Ref To IShape. " Array of Objects
with Shape Behaviour

* Concrete Objects with IShape Behaviour!
Data: C1 Type Ref To CCircle,
S1 Type Ref To CSquare,
R1 Type Ref To CRectangle,
C2 Type Ref To CCircle,
S2 Type Ref To CSquare,
R2 Type Ref To CRectangle.


Data: descr_ref TYPE ref to CL_ABAP_TYPEDESCR,
ClassName Type String,
Serial Type I.

Data: myArea Type F,
myCircumference Type F.

START-OF-SELECTION.
Create Object C1 Exporting pRadius = '2.5'.
Create Object C2 Exporting pRadius = '5.0'.

Create Object S1 Exporting pSide = '3.5'.
Create Object S2 Exporting pSide = '6.0'.

Create Object R1 Exporting pHeight = '2.8' pLength = '3.4'.
Create Object R2 Exporting pHeight = '1.7' pLength = '6.3'.

* Append in any order!
Append S1 to ShapeTable.
Append R2 to ShapeTable.
Append R1 to ShapeTable.
Append C2 to ShapeTable.
Append C1 to ShapeTable.
Append S2 to ShapeTable.

Serial = 0.

Loop At ShapeTable into OneShape.
Call Method OneShape->getArea
Receiving area = myArea.
Call Method OneShape->getCircumference
Receiving circumference = myCircumference.

descr_ref = CL_ABAP_TYPEDESCR=>Describe_By_Object_Ref( OneShape
).
Call Method descr_ref->get_relative_name
Receiving P_RELATIVE_NAME = ClassName.

Add 1 to Serial.

Write: / Serial, ClassName.
Write: / 'Area ', myArea Decimals 4 Exponent
0.
Write: / 'Circumference ', myCircumference Decimals 4 Exponent
0.
Write: /.

EndLoop.

** Results
* 1 CSQUARE
* Area 12.2500
* Circumference 14.0000
*
* 2 CRECTANGLE
* Area 10.7100
* Circumference 16.0000
*
* 3 CRECTANGLE
* Area 9.5200
* Circumference 12.4000
*
* 4 CCIRCLE
* Area 31.4159
* Circumference 78.5398
*
* 5 CCIRCLE
* Area 15.7080
* Circumference 19.6350
*
* 6 CSQUARE
* Area 36.0000
* Circumference 24.0000

Comments: 发表评论



<< Home

Archives

1990年1月15日   2007年1月14日   2007年1月15日   2007年1月16日   2007年1月17日   2007年1月18日   2007年1月19日   2007年1月20日   2007年1月22日   2007年1月23日   2007年1月24日   2007年1月25日   2007年1月26日   2007年1月27日   2007年1月29日   2007年1月30日   2007年1月31日   2007年2月1日   2007年2月2日   2007年2月3日   2007年3月13日   2007年5月15日   2007年5月16日   2007年6月2日  

This page is powered by Blogger. Isn't yours?