Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
51
Task/Polymorphic-copy/ALGOL-68/polymorphic-copy.alg
Normal file
51
Task/Polymorphic-copy/ALGOL-68/polymorphic-copy.alg
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
BEGIN
|
||||
# Algol 68 doesn't have classes and inheritence as such, however structures #
|
||||
# can contain procedures and different instances of a structure can have #
|
||||
# different versons of the procedure #
|
||||
# this allows us to simulate inheritence by creating structure instances #
|
||||
# with different procedures #
|
||||
|
||||
# the following declares a type (MODE) HORSE with two constructors, one for #
|
||||
# a standard horse and one for a zebra (the "derived class"). #
|
||||
# The standard horse has its print procedure set to thw print horse #
|
||||
# procedure (the "base class" method). zebras get the print zebra procedure #
|
||||
# (the "derived class" method). A convenience operator (PRINT) is defined #
|
||||
# to simplify calling the horse/zebra print method of its horse parameter #
|
||||
# = this PRINT operator is independent of which actual print method the #
|
||||
# horse has - it just saved typeing "( print OF h )( h )" everywhere we #
|
||||
# need to call the print method (euivalent to h.print(h) in e.g. C, Java, #
|
||||
# etc.) #
|
||||
|
||||
# "class" #
|
||||
MODE HORSE = STRUCT( STRING name, PROC(HORSE)VOID print );
|
||||
# constructors #
|
||||
PROC new horse = ( STRING name )HORSE: ( name, print horse );
|
||||
PROC new zebra = ( STRING name )HORSE: ( name, print zebra );
|
||||
# print methods: one for a standard horse and one for a zebra #
|
||||
PROC print horse = ( HORSE h )VOID: print( ( "horse: ", name OF h ) );
|
||||
PROC print zebra = ( HORSE h )VOID: print( ( "zebra: ", name OF h ) );
|
||||
# print operator #
|
||||
OP PRINT = ( HORSE h )VOID: ( print OF h )( h );
|
||||
|
||||
# declare and construct some horses and zebras #
|
||||
HORSE h1 := new horse( "silver blaze" );
|
||||
HORSE z1 := new zebra( "stripy" );
|
||||
HORSE z2 := new zebra( "second zebra" );
|
||||
|
||||
# show their values #
|
||||
PRINT h1; print( ( newline ) );
|
||||
PRINT z1; print( ( newline ) );
|
||||
PRINT z2; print( ( newline ) );
|
||||
print( ( "----", newline ) );
|
||||
|
||||
# change the second zebra to be a copy of the first zebra #
|
||||
z2 := z1;
|
||||
PRINT z1; print( ( newline ) );
|
||||
PRINT z2; print( ( newline ) );
|
||||
print( ( "----", newline ) );
|
||||
|
||||
# change the name of the first zebra leaving z2 unchanged #
|
||||
name OF z1 := "ed";
|
||||
PRINT z1; print( ( newline ) );
|
||||
PRINT z2; print( ( newline ) )
|
||||
END
|
||||
Loading…
Add table
Add a link
Reference in a new issue