Ben: In CogVM you have #adoptInstance:

MyClass adoptInstance: whateverObject.

Before Cog, you had #primitiveChangeClassTo:

whateverObject  primitiveChangeClassTo:  anotherOBJECT

in this case, whateverObject will change its class to the class of
anotherOBJECT

cheers

On Wed, Dec 28, 2011 at 12:08 PM, Ben Coman <[email protected]> wrote:

> Schwab,Wilhelm K wrote:
>
>> Ben,
>>
>> That's a lot to read.  If I'm getting the message, you want to subclass
>> ODBCRow and are concerned about Metacello.
>>
> Point taken.  In hindsight too much background info and a mixed message.
> Actually it wasn't not a question about Metacello - though my other recent
> mention of ConfigurationOfODBC was.  I only mentioned ConfigurationOfODBC
> here to distinguish it from the ODBC in DBXTalk - and in hindsight that is
> not the core question.  The short version is "how do I change the class of
> existing object into one of its subclasses".  I've got it working, but not
> if I add an instance variable to the subclass.
>
>  FWIW, I suspect I would make some type of wrapper class for the rows
>> rather than subclass - the goal being to strive for uses-a vs. is-a.
>>
>>
> I had considered that briefly but was concerned that the wrapped class
> needed to understand every message that the wrapped-class understood.  I
> wanted to use the existing ODBCResultTable which holds the ODBCRows to
> contain my new subclass of ODBCRow.  I will think further about this.
>
>  Idealistically (and perhaps naively) yours,
>>
>>
> More than I would know. Thanks for your time. -Ben
>
>  Bill
>>
>>
>> ______________________________**__________
>> From: 
>> pharo-project-bounces@lists.**gforge.inria.fr<[email protected]>[
>> pharo-project-bounces@lists.**gforge.inria.fr<[email protected]>]
>> on behalf of Ben Coman [[email protected]]
>> Sent: Tuesday, December 27, 2011 11:46 PM
>> To: 
>> [email protected].**inria.fr<[email protected]>
>> Subject: [Pharo-project] changing the class of an existing object to a
>>  subclass
>>
>> greetings all,
>>
>> I am using ConfigurationOfODBC in Pharo 1.3.  I have had success with
>> getting an ODBCResultTable(**OrderedCollection) containing ODBCRow
>> containing about 30 fields.  By default the fields are accessed by "row
>> at: #fieldName" but I wanted to add some convenience methods to instead
>> go "row fieldName."  My searching and experimentation led me to
>> subclassing ODBCRow as EAPPackage and then using "adoptInstance:" on
>> each ODBCRow to convert it to the subclass.  This was to avoid having to
>> having to understand and change any of the ConfigurationOfODBC code.  I
>> had tried copyFrom: but some of the instance variables inherited from
>> ODBCRow were not filled in, generating exceptions in some of the
>> inherited methods. I had also considered "become:" but that didn't seem
>> appropriate.
>>
>> Using "adoptInstance:" worked fine until I added a new instance variable
>> to EAPPackage.  Subsequently for "<primitive: 160 error: ec>", ec =
>> #'bad receiver'.  The "adoptInstance:" method comment says it follows
>> the same rules as "primitiveChangeClassTo:" (yet note that
>> "primitiveChangeClassTo:" never worked)
>> The "primitiveChangeClassTo:" method comment says "The primitive will
>> fail in most cases that you think might work [...] The facility is
>> really provided for certain, very specific applications (mostly related
>> to classes changing shape) and not for casual use" so I wondered if
>> there was another way to achieve this.
>>
>> The full code is hopefully not too long to include for reference below.
>> The use of "adoptInstance:" in the last section listed.
>> ------
>> ODBCRow subclass: #EAPPackage
>>    instanceVariableNames: 'parent'   "note adoptInstance works without
>> this instance variable, and not with"
>>    classVariableNames: ''
>>    poolDictionaries: ''
>>    category: 'BTC-EA-Explore'
>> ------
>> EAPPackage >> name
>>    ^ self at: #Name
>> ------
>> ODBCResultTable subclass: #EAPPackages
>>    instanceVariableNames: ''
>>    classVariableNames: ''
>>    poolDictionaries: ''
>>    category: 'BTC-EA-Explore'
>> ------
>> EAPPackages class >> newFromConnection: connection
>>    | packages parent |
>>    packages := (connection query: 'select * from t_package;') execute
>> asTable.
>>    self adoptInstance: packages.
>>
>>    packages do: [ :row | EAPPackage adoptInstance: row. ].
>>
>>    ^packages.
>> ------
>> In a Workspace I successfully evaluate the following three lines without :
>>   connection := ODBCConnection dsn: 'CIM' user: '' password: ''.
>>   packages := EAPPackages newFromConnection: connection.
>>   connection close.
>> ------
>>
>> I found the ODBCRow instance creation to ODBCResultSet>>fetchRow.  One
>> alternative I've considered is to somehow pass through a custom
>> SomeClass in a variable to replace the hard reference to ODBCRow - but I
>> don't want to chase back all the cascading call references.
>>
>> Is there another way to change an existing object to another class, such
>> that it can be specialised with both additional  methods and instance
>> variables?
>> I would appreciate any pointers.
>>
>> regards, Ben
>>
>>
>>
>>
>>
>
>
>


-- 
Mariano
http://marianopeck.wordpress.com

Reply via email to