This is ShapeArea_main.m in view mode; [Download] [Up]
#import <appkit/appkit.h> #import "Rectangle.h" #import "Square.h" // a program that demonstrates dynamic binding // function prototypes void createObjects(void), run(void); void calculateAreas(void), freeAll(void); void main(void); BOOL readInput(void); // global variable id theList; void createObjects(void) { // create list to hold shapes theList = [[List alloc] init]; } void run(void) { // stay in loop until Q is pressed BOOL done = NO; while (!done) { done = readInput(); } } BOOL readInput(void) { char inputString[10]; unsigned int choice; float width, height; id object; // print the menu printf("\nShapeArea calculates the "); printf("areas of various shapes\n"); printf("==============\n"); printf("Select a shape\n"); printf("Type Q to quit\n\n"); printf("1 rectangle\n"); printf("2 square\n"); printf("===============\n"); // get input scanf("%s", inputString); if (strcmp(inputString, "Q") != 0) { choice = atoi(inputString); switch (choice) { case 1: // get width and height printf("Enter the height\n"); scanf("%f", &height); printf("Enter the width\n"); scanf("%f", &width); // create rectangle and init it object = [[Rectangle alloc] initHeight:height width:width]; // add rectangle to list [theList addObject:object]; printf("The area of this shape is %.2f\n", [object calcArea]); break; case 2: // get height for square printf("Enter the height\n"); // since a square's height // is equal to its width, // get only one value scanf("%f", &height); // create square and init it object = [[Square alloc] initHeight:height width:height]; // add square to list [theList addObject:object]; printf("The area of this shape is %.2f\n", [object calcArea]); break; default: // invalid choice printf("No such shape!\n"); printf("Please try again!\n\n"); break; } // return NO to stay in while loop // of run() function return NO; } else // return YES to abort while loop return YES; } void calculateAreas(void) { int i; // traverse the list and request each // instance to perform its calcArea method // this demonstrates dynamic binding // since it impossible to determine // the class of each instance until runtime for (i=0; i < [theList count]; i++) { printf("\nThis shape is an instance of %s\n", [[theList objectAt:i] name]); printf("The area of this shape is %.2f\n", [[theList objectAt:i] calcArea]); } } void freeAll(void) { // free the objects in the list // freeObjects sends a free message // to each object in the list [theList freeObjects]; // free the list itself [theList free]; } void main(void) { createObjects(); run(); calculateAreas(); freeAll(); exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.