Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > How to call a class method when (i.e. in the moment of) inheritingfrom a class/defining a descendant?

Reply
Thread Tools

How to call a class method when (i.e. in the moment of) inheritingfrom a class/defining a descendant?

 
 
Thomas
Guest
Posts: n/a
 
      06-06-2005
Hi,

This problem maybe results from a bad understanding of what I'm trying
to do. Anyway, is it possible to call a method when creating a new class
or inheriting from another class?

Currently my code looks somehow like this:

class A
class << self
attr_reader

def prepare
# do something
end

def fixate
# do something
end

def foo(a)
# do something with a and @x
end
end
end

class B < A
prepare

@x = "something"

foo("bar")

def method1
# do something else
end

fixate
end

Now in an ideal world, the definition of class B would be simply:

class B < A
@x = "something"

def method1
# do something
end
end

and A.setup and A.fixate should be automagically invoked whenever
defining a descendant from class A.

Does somebody know a solution for how this can be done? The only
possible way of doing this I could come up with is to wrap the
definition part into a block and pass this block to a method that calls
these functions and evaluates the block using class_eval. Something in
the line of (untested):

class C < A
wrapper do
@x = "something"

def method1
# do something
end
end
end

But I'm not sure if this solution really is an advantage.

Cheers,
Thomas.



 
Reply With Quote
 
 
 
 
Gennady Bystritksy
Guest
Posts: n/a
 
      06-06-2005
You must keep in mind that a class instance variable is local for the
particular class object. In your case, trying to set @x in B does it
locally for class B, not affecting @x in class A in any way, even when B
inherits from A. You may want to define "attr_writer " in class A and
use "self.x = 'something'" in class B.

Gennady.

Thomas wrote:
> Hi,
>
> This problem maybe results from a bad understanding of what I'm trying
> to do. Anyway, is it possible to call a method when creating a new class
> or inheriting from another class?
>
> Currently my code looks somehow like this:
>
> class A
> class << self
> attr_reader
>
> def prepare
> # do something
> end
>
> def fixate
> # do something
> end
>
> def foo(a)
> # do something with a and @x
> end
> end
> end
>
> class B < A
> prepare
>
> @x = "something"
>
> foo("bar")
>
> def method1
> # do something else
> end
>
> fixate
> end
>
> Now in an ideal world, the definition of class B would be simply:
>
> class B < A
> @x = "something"
>
> def method1
> # do something
> end
> end
>
> and A.setup and A.fixate should be automagically invoked whenever
> defining a descendant from class A.
>
> Does somebody know a solution for how this can be done? The only
> possible way of doing this I could come up with is to wrap the
> definition part into a block and pass this block to a method that calls
> these functions and evaluates the block using class_eval. Something in
> the line of (untested):
>
> class C < A
> wrapper do
> @x = "something"
>
> def method1
> # do something
> end
> end
> end
>
> But I'm not sure if this solution really is an advantage.
>
> Cheers,
> Thomas.
>
>




 
Reply With Quote
 
 
 
 
gabriele renzi
Guest
Posts: n/a
 
      06-06-2005
Thomas ha scritto:

> Does somebody know a solution for how this can be done?


see Class#inherited:

>> class A
>> def self.inherited(klass)
>> p "wow I got childs:"+klass.to_s
>> end
>> end

=> nil
>> class A2 < A
>> end

"wow I got childs:A2"
=> nil
>> Class.new(A2)

"wow I got childs:#<Class:0x2bd54e0>"
=> #<Class:0x2bd54e0>
 
Reply With Quote
 
Ara.T.Howard
Guest
Posts: n/a
 
      06-06-2005
On Mon, 6 Jun 2005, Thomas wrote:

> Hi,
>
> This problem maybe results from a bad understanding of what I'm trying to do.
> Anyway, is it possible to call a method when creating a new class or
> inheriting from another class?
>
> Currently my code looks somehow like this:
>
> class A
> class << self
> attr_reader
>
> def prepare
> # do something
> end
>
> def fixate
> # do something
> end
>
> def foo(a)
> # do something with a and @x
> end
> end
> end
>
> class B < A
> prepare
>
> @x = "something"
>
> foo("bar")
>
> def method1
> # do something else
> end
>
> fixate
> end
>
> Now in an ideal world, the definition of class B would be simply:
>
> class B < A
> @x = "something"
>
> def method1
> # do something
> end
> end
>
> and A.setup and A.fixate should be automagically invoked whenever defining a
> descendant from class A.
>
> Does somebody know a solution for how this can be done? The only possible way
> of doing this I could come up with is to wrap the definition part into a
> block and pass this block to a method that calls these functions and
> evaluates the block using class_eval. Something in the line of (untested):
>
> class C < A
> wrapper do
> @x = "something"
>
> def method1
> # do something
> end
> end
> end
>
> But I'm not sure if this solution really is an advantage.


harp:~ > cat a.rb
class A
class << self
def setup
puts "<#{ self }> invoking setup..."
end
def inherited klass
klass.setup
end
end
end

class B < A
end

harp:~ > ruby a.rb
<B> invoking setup...

hth.

-a
--
================================================== =============================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| My religion is very simple. My religion is kindness.
| --Tenzin Gyatso
================================================== =============================



 
Reply With Quote
 
Thomas
Guest
Posts: n/a
 
      06-07-2005
> class A
> class << self
> def setup
> puts "<#{ self }> invoking setup..."
> end
> def inherited klass
> klass.setup
> end
> end
> end
>
> class B < A
> end


Thanks for this reference to "inherited" -- I didn't know about this
method and its purpose. As so often with ruby, the solution is somehow
self-evident/explanatory in retrospect.

Regards,
Thomas.



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
r H2 deduce deduce template argument of a template class inheritingfrom a non template base? nguillot C++ 5 03-08-2009 05:56 PM
why a class can't access protected method from another class in thesame package,the method is interited from the ohtner class from differntpackage? junzhang1983@gmail.com Java 3 01-28-2008 02:09 AM
how to call method of the class which contains a pointer to other class method? Pawel_Iks C++ 3 07-31-2007 06:30 AM
moment by moment Ken W. DVD Video 0 09-24-2003 12:22 AM



Advertisments