Re: Inheritance

From: Hannu Krosing <hannu(at)tm(dot)ee>
To: Jeff Davis <list-pgsql-hackers(at)empires(dot)org>
Cc: Curt Sampson <cjs(at)cynic(dot)net>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Inheritance
Date: 2002-09-05 14:00:23
Message-ID: 1031234423.597.108.camel@taru.tm.ee
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, 2002-09-05 at 12:29, Jeff Davis wrote:
> >
> > This is not so wrong. If you think about it, you have the same
> > problem in most object-oriented programming languages: a person
> > object can't generally easily become a subclass of itself after
> > being created.
> >
> > This is a case, I would say, where you simply don't want to use
> > inheritance. A person has-a job, not is-a job.
> >
>
> But a person is-a employee (allow me to momentarily step aside from the rules
> of english grammer, if you would), and a person is-a programmer. That's why I
> didn't call my table "job" :) [1]
>
> I don't like the way some OO programming languages handle objects, if they
> mean to say you can't change an object's type without performing a logical
> data copy to a new object. If you don't use some kind of extra layer of
> abstraction in C, you will end up with that problem: you'd need to copy all
> that RAM over to change from one struct to another. Most people would rather
> take that RAM copying hit than all the hits for allowing "room to expand" (at
> least in some applications). However, postgres needs to provide that "room to
> expand" for each tuple anyway, so to go through the same copying seems bad
> (especially since we're no longer just talking RAM).

I would like to have UPDATEs both up and down the inheritance hierarchy,
so that when I have hierarchy

OBJECT(id serial primary key)
+ HUMAN(name text,age int)
+ EMPLOYEE(salary numeric)
+ ENGINEER(workstation computer)
+ PHB(laptop computer)

and ENGINEER named Bob

I could do

UPDATE ENGINEER
TO PHB
SET salary = salary * 2 + age * 1000,
laptop.disksize = max(laptop.disksize ,
workstation.disksize + 1000000)
WHERE name='Bob'
;

to promote Bob from an engineer to phb, give him a salary rise and a
laptop with default configuration ensuring big enough disk to keep all
his old files, but still keep all FK related records.

> Take as an example python... it's easy to emulate other objects: just assign
> to the attribute, even if it's not there yet, it'll add the attribute. Same
> with python, it's providing room to expand for it's objects already, so why
> do all the copying?

that's unless you use the new-style objects and __slots__

>>> class myobj(object):
... __slots__ = ['a','b']
...
>>> M = myobj()
>>> M.a =1
>>> M.c =1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'myobj' object has no attribute 'c'
>>>

> Same with python, it's providing room to expand for it's objects already,
> so why do all the copying?

> [1] Come to think of it, the JOIN operator seems to, at least on a first
> thought, represent the "has-a" relationship you describe. You could have the
> tuples "manager" and "programmer" in the table "job" and join with a "people"
> table. Don't ask about inheritance yet for this model, I'm still thinking
> about that one (does "has-a" even have an analogue to inheriteance?).

Not in inheritance, but in OO world attributes are used to express has-a
relations. So

bob = people(name='Bob')
bob.job = job('Manager')

makes an has-a relation between Bob and his job in python

BTW, good programming guidelines in python tell you not to test if bob
is-a something but rather test if the interface for something exists -
to see if you can iterate over bob you do not test if bob is a sequence
but just try it:

try:
for idea in bob:
examine(idea)
except TypeError:
print 'Failed to iterate over %s %s !' % (bob,job.name, bob.name)

---------------
Hannu

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2002-09-05 14:09:13 Re: beta1 packaged
Previous Message Tom Lane 2002-09-05 13:37:14 Re: 7.2 - 7.3 activity