[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Programming it's a play

From: Pascal J . Bourguignon
Subject: Re: Programming it's a play
Date: Sun, 21 Sep 2003 02:00:26 +0200

Nicolas Roard writes:
> > Please correct me if I am wrong since it is only since today that I feel I 
> > realy understand the difference between a Class, a Class object, an Object 
> > and an Instance.
> Well, imho you shouldn't speak about a "class object" because it's a
> bit misleading -- it's not really an object. And an object IS an
> instance, it's the definition. It's an instance of a class of
> objects.

Classes are objects  that most often are created  at compilation time,
but not necessarily.   You can easily create a  class object and class
and instance methods at runtime,  then instanciate this class and send
messages to this object.

That is, you  can easily do this in Objective-C or  in Smalltalk or in
Lisp, because they  are dynamical languages, while it's  so hard as to
be impossible in C++, but we're not discussing C++.

(I  must admit that  there is  a little  problem in  Objective-C, that
there is  no standard API  to the objc  runtime, so doing it  would be
compiler dependant).

To see that there is no difference between a class and an object, just try:

#include <objc/Object.h>
#include <stdio.h>
#include <stdlib.h>

   static void print_name(id thing)
       printf("name of thing at %08p is: %s\n",thing,[thing name]);

   @interface NamedObj:Object
          char* myName;
       -(void)setName:(const char*)newName;
       -(const char*)name;

   @implementation NamedObj
       -(void)setName:(const char*)newName
       -(const char*)name

   int main(int argc,char** argv)  
       id    anObject=[[Object alloc]init];
       Class aClass=[anObject class];
       id    anotherObject=[[NamedObj alloc]init];
       Class anotherClass=[anotherObject class];
       [anotherObject setName:argv[1]?argv[1]:"John Doe"];

address@hidden tests]$ gcc -o objc-class-objc objc-class-objc.m -lobjc -lpthread
address@hidden tests]$ ./objc-class-objc toto
name of thing at 0x8058790 is: Object
name of thing at 0x8056520 is: Object
name of thing at 0x80587d0 is: toto
name of thing at 0x8055f40 is: NamedObj

So, you see  that you can have an class object  or an instance object,
and not knowing what it is, send it a message and get work done.

Now,  in Objective-C, there  IS a  difference between  metaclasses and
other objects.  In Smalltalk and in Lisp, there is none. 

Do not adjust your mind, there is a fault in reality.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]