home *** CD-ROM | disk | FTP | other *** search
- ; 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
-