David,

When you say have a Relationship to the abstract Role class, I'm assuming 
you're recommending inheritance here.  I do it the exact same way, just wanted 
to make sure it's not confusing to say "do abstract this" and also "get rid of 
inheritance".

For me, I have this type of structure in a few places.  In one of them, the 
subclasses of Role use single table inheritance, since the subclasses all have 
similar data, but the methods are different.  For another, I use horizontal, 
since the data structures vary significantly.  Thankfully, there aren't 
thousands of objects, so performance is not a problem here.

Johan, you can always implement something in your Contact class like:

- (boolean) isActor {
    //  check to see if the to-one (or to-many) role(s) relationship has an 
instance of the Actor role
}

or something like this:

- (ActorRole *) actorRole {
   // find actor role in relationship or return null
}

to see if the contact fits the bill for a particular situation or not.  
Personally, I always make the role relationship to-many, so that someone can 
have multiple roles (will ALWAYS happen IMHO).

Ken

On Aug 20, 2011, at 6:33 AM, David Avendasora wrote:

> I've been there, Johan. Don't use inheritance. That's what is messing with 
> you. An EO can't switch from being one Class to another. It completely er... 
> um... screws with EOF.
> 
> Get rid of the inheritance. Just have a Contact class that has a relationship 
> to the abstract Role class, and make all the the roles subclasses of Role. 
> You can change a contacts behaviors by setting the role relationship to an 
> instance of one of the subclasses on-the-fly, however you want. Each subclass 
> of Role can implement the various behaviors in their own way.
> 
> The trick is that when you want a contact to behave as an actor, you set the 
> role relationship to an instance of actor then call 
> contact.role.assignUnderstudy(contact).
> 
> Wait, you say, it is completely invalid to take a role 
> nicepersontoalwayinviteforfreetoanyshow and say 
> contact.role.assgnUnderstudy(contact)! well, the 
> NicePersonToAlwaysInviteForFreeToAnyShow class has an empty implementation of 
> the assgnUnderstudy(contact) method, or one that throws an error that the UI 
> catches to tell the user that they are a daft git for doing something stupid 
> as trying to give a  nicepersontoalwayinviteforfreetoanyshow an understudy. 
> Shesh. Everyone knows they can only be assigned AS understudies.
> 
> That's the basics. Just get rid of Inheritance. Especially Vertical 
> Inheritance (sorry Lachlan).
> 
> Dave
> 
> On Aug 20, 2011, at 4:58 PM, Johan Henselmans wrote:
> 
>> 
>> On 20 aug. 2011, at 01:26, Chuck Hill wrote:
>> 
>>> 
>>> On 2011-08-19, at 2:46 PM, Johan Henselmans wrote:
>>> 
>>>> My idea:
>>>> 
>>>> I have an entity contact, that gets vertically inherited into actor, 
>>>> employee, visitor, nicepersontoalwayinviteforfreetoanyshow, whatever, 
>>>> based on the role somebody/thing plays. 
>>>> 
>>>> A contact can have different roles, which makes this contact playing 
>>>> actor, employee, visitor, nicepersontoalwayinviteforfreetoanyshow or 
>>>> whatever. So there is a m-n relation roles in a contact. 
>>> 
>>> Where is Kieran?  This is his favourite question.  It sounds like you 
>>> should be using the Role pattern and not inheritance.  
>>> http://objectdiscovery.com/solutions/publications/roles/index.html
>>> 
>>> 
>> 
>> I thought I used a Role pattern. situation:
>> base class is contact, others are inheritances all in the same table
>> contact - visitor 
>>            -actor 
>>               -director
>>              -nice person
>> 
>> role class - (defined via eo) 
>> 
>> contact<->role m:n
>> 
>> I would assume that figure 13 in the article would be the most desirable 
>> solution, as the role definition is dynamic (roles can be added)
>> 
>> 
>> <figure-13.gif>
>> 
>> but I do not get how in that situation the specific methods and data of a 
>> specific role would then be defined. Or perhaps I miss the point?
>> 
>> For instance, and actor can have a relationship to a specific show, a 
>> theatergroup, a paycheck, a visitor can have visited a specific performance, 
>> etc. Where would you define that kind of behavior? 
>> 
>> 
>> 
>>> 
>>>> I assumed that I should be able to create and get a visitor if I could 
>>>> describe in the EOModel qualifier something like roles.ROLE.name = 
>>>> 'visitor'
>>>> 
>>>> Something like this:
>>>> <PastedGraphic-3.png>
>>>> And I would create the relation to the role in the awakeFromInsertion 
>>>> phase of the Visitor. 
>>>> 
>>>> Of course this is not working, (nothing ever works where I live) as I am 
>>>> getting 
>>>> 
>>>> takeValueForKey(): attempt to assign value to unknown key: 
>>>> 'roles.ROLE.name'. This class does not have an instance variable of the 
>>>> name roles.ROLE.name
>>>> 
>>>> 
>>>> What is the proper incantation to do this?
>>> 
>>> I think that is not possible.  The restricting qualifier has to be 
>>> evaluated on that single entity only.
>>> 
>>> Chuck
>>> 
>>> -- 
>>> Chuck Hill             Senior Consultant / VP Development
>>> 
>>> Practical WebObjects - for developers who want to increase their overall 
>>> knowledge of WebObjects or who are trying to solve specific problems.    
>>> http://www.global-village.net/products/practical_webobjects
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> Johan Henselmans
>> [email protected]
>> 
>> 
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/webobjects%40avendasora.com
>> 
>> This email sent to [email protected]
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      ([email protected])
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/kenlists%40anderhome.com
> 
> This email sent to [email protected]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to