home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
ckscripts
/
multiple
< prev
next >
Wrap
Text File
|
2020-01-01
|
6KB
|
204 lines
; From: Dat Thuc Nguyen
; Date: Tue, 27 Apr 1999 20:35:16 +0000
; Subject: Script: Multiple Inheritance in C-Kermit OOP
; URL: http://www.smalltickle.com
;
; Multiple inheritance enriches software design.
; Not all OOP languages have it: C++ does; Java, Smalltalk don't.
; The following script implements multiple inheritance in C-Kermit.
; The famous animal class found in many C++ and Smalltalk references
; is used to present the subject.
;
; The Mammal class of animal has three data members: age, color, kind;
; and three member functions: kind, age, color, and destroy.
;
; The Endangered class of animal has one member data: category, and
; two member functions: category and destroy.
;
; The Bear class of animal derives from the Mammal class. It overrides
; the member function: destroy, and supplies one more member function:
; favorite_food.
;
; The Panda class of animal is a multiple inheritance of the Bear and
; the Endangered classes, it overrides the function: destroy.
;
; The proper usage of the following elements in C-Kermit:
; assign, _assign, define, _define, \v(macro)
; creates the OOP mechanisms:
; polymorphism, overriding method, late binding.
;
; The syntax of Smalltalk in message invocation is applied here to
; reduce code and simplify class evolution.
;
; In the multiple derived class, the selection of the member functions
; of the super classes can be determined or overridden. This flexibility
; does not even exist in any of the OOP languages mentioned above.
;**************************************************
;* DEFINITION OF THE CLASS MAMMAL *
;**************************************************
define Mammal {
; \%1 name of the new Mammal
; \%2 age of the new Mammal
; \%3 color of the new Mammal
; kind is supplied by the derived class
_assign Mammal::\%1.age \%2
_assign Mammal::\%1.color \%3
_define \%1 {
if define \m(Mammal::\%1) {
Mammal::\%1 \v(macro) {\%2} {\%3} {\%4}
} else {
return doesNotUnderstand
}
}
}
;**************************************************
;* PUBLIC USAGE INTERFACE OF THE CLASS MAMMAL *
;**************************************************
define Mammal::kind {
echo \m(Mammal::\%1.kind)
}
define Mammal::age {
echo \m(Mammal::\%1.age)
}
define Mammal::color {
echo \m(Mammal::\%1.color)
}
define Mammal::destroy {
_define Mammal::\%1.kind
_define Mammal::\%1.age
_define Mammal::\%1.color
_define \%1
}
;**************************************************
;* DEFINITION OF THE CLASS BEAR *
;**************************************************
define Bear {
; \%1 name of the new Bear
; \%2 age of the new Bear
; \%3 color of the new Bear
Mammal Mammal::\%1 \%2 \%3
_assign Mammal::Mammal::\%1.kind \v(macro)
_define \%1 {
local \%r
if define \m(Bear::\%1) {
Bear::\%1 \v(macro) \%2 \%3
if FAIL END \v(return)
assign \%r \v(return)
} else {
Mammal::\v(macro) \%1 \%2 \%3
if FAIL END \v(return)
assign \%r \v(return)
}
return \%r
}
}
;**************************************************
;* PUBLIC USAGE INTERFACE OF THE CLASS BEAR *
;**************************************************
define Bear::favorite_food {
echo Honey
}
define Bear::destroy {
Mammal::\%1 destroy
_define \%1
}
;**************************************************
;* DEFINITION OF THE CLASS ENDANGERED *
;**************************************************
define Endangered {
; \%1 Endangered name
; \%2 endangered category
_assign Endangered::\%1.category \%2
_define \%1 {
if define \m(Endangered::\%1) {
Endangered::\%1 \v(macro) {\%2} {\%3} {\%4}
} else {
return doesNotUnderstand
}
}
}
;****************************************************
;* PUBLIC USAGE INTERFACE OF THE CLASS ENDANGERED *
;****************************************************
define Endangered::category {
echo \m(Endangered::\%1.category)
}
define Endangered::destroy {
_define Endangered::\%1.category
_define \%1
}
;**************************************************
;* DEFINITION OF THE CLASS PANDA *
;**************************************************
define Panda {
; \%1 name of the new Panda
; \%2 age of the new Panda
; \%3 endangered category of the new Panda
Bear Bear::\%1 \%2 black_and_white
Endangered Endangered::\%1 \%3
_assign Mammal::Mammal::Bear::\%1.kind \v(macro)
_define \%1 {
local \%r super \%i \&a[]
if define \m(Panda::\%1) {
Panda::\%1 \v(macro) \%2 \%3 \%4
if FAIL END \v(return)
assign \%r \v(return)
} else {
assign super Bear:Endangered
for \%i 1 \fsplit(\m(super),&a,:) 1 {
\&a[\%i]::\v(macro) \%1 \%2 \%3
if FAIL END \v(return)
assign \%r \v(return)
if define \%r {
if NOT EQUAL \%r doesNotUnderstand return \%r
}
}
}
return \%r
}
}
;**************************************************
;* PUBLIC USAGE INTERFACE OF THE CLASS PANDA *
;**************************************************
define Panda::destroy {
_define Bear::\%1
_define Endangered::\%1
_define \%1
}
;**************************************************
; USAGE SAMPLES *
;**************************************************
; BEJING presented the Zoo of NEWYORK with a Panda
; named Teddy, 3 years old, endangered category 5,
; its default color is naturally black_and_white.
Panda Teddy 3 5
; What kind of animal is Teddy?
Teddy kind ; => panda
; How old is Teddy?
Teddy age ; => 3
; What endangered category is Teddy?
Teddy category ; => 5
; What is Teddy's favorite food?
Teddy favorite_food ; => honey
; Yesterday somebody stole Teddy, the Zoo administration
; deletes him from the zoo habitant list:
Teddy destroy
END