# Overriding a class method

**URL:** <https://www.ruby-forum.com/t/overriding-a-class-method/58228>\
**Category:** Ruby\
**Created:** [April 19, 2006, 8:50pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228 "2006-04-19T20:50:04Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 8:50pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/1 "2006-04-19T20:50:04Z")

</div>

Here’s a quick question for the Meta-programming gurus

start with

class A  
def self.method\_a  
puts “A”  
end  
end

How would I override method\_a in such a way that the original method\_a  
could be called at the end? sort of like that way you can call ‘super’  
from a subclass.

\_Kevin

---

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 8:56pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/2 "2006-04-19T20:56:14Z")

</div>

super still works:

irb(main):001:0\> class A  
irb(main):002:1\> def self.method\_a  
irb(main):003:2\> puts “A”  
irb(main):004:2\> end  
irb(main):005:1\> end  
=\> nil  
irb(main):006:0\> class NewA \< A  
irb(main):007:1\> def self.method\_a  
irb(main):008:2\> puts “NewA”  
irb(main):009:2\> super  
irb(main):010:2\> end  
irb(main):011:1\> end  
=\> nil  
irb(main):012:0\> NewA.method\_a  
NewA  
A

Farrel

---

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 9:09pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/3 "2006-04-19T21:09:04Z")

</div>

I’m not a guru, but the following works for me, though it is not very  
elegant:

class A  
def self.method\_a  
puts “A”  
end  
end

class A  
@@old\_method\_a = self.method(:method\_a)  
def self.method\_a  
puts “B”  
@@old\_method\_a.call  
end  
end

A.method\_a # outputs “B”, then “A”

- Jake McArthur

---

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 9:02pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/4 "2006-04-19T21:02:27Z")

</div>

Oh wait I think I misunderstood the question are you looking to  
overwrite it in the same  
class?

---

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 9:30pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/5 "2006-04-19T21:30:41Z")

</div>

Yeah, not looking to subclass.

On Thursday, April 20, 2006, at 3:59 AM, Farrel L. wrote:

> Oh wait I think I misunderstood the question are you looking to  
> overwrite it in the same  
> class?

\_Kevin

---

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 9:52pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/6 "2006-04-19T21:52:19Z")

</div>

On 4/19/06, Kevin O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Yeah, not looking to subclass.

class A  
def self.meth\_a  
puts “one”  
end  
end

class A  
class \<\< self; alias meth\_a\_old meth\_a end  
def self.meth\_a  
meth\_a\_old  
puts “two”  
end  
end

Though I personally think use of alias for this sort of thing as a  
“hack” (just my opinion of course). Another technique is to use a  
lexical closure:

class A  
def self.meth\_a  
puts “one”  
end  
end

class A  
old\_a = method(:meth\_a)

# The ugly part. This usually is nicer for instance methods.

# You could write this a few different ways but they are all

# ugly. Possibly something to factor out as a method.

sclass = class \<\< self; self end  
sclass.send :define\_method, :meth\_a do  
old\_a.call  
puts “two”  
end  
end

Both are messy but one is less likely to collide or cause problems  
with other code (not to mention littering the class with aliases).

Brian.

---

<div class="post-metadata">

**Author:** ![olbrich](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/5f9b8f/32.png) [@olbrich](https://www.ruby-forum.com/u/olbrich)\
**Post date:** [April 19, 2006, 11:04pm UTC](https://www.ruby-forum.com/t/overriding-a-class-method/58228/7 "2006-04-19T23:04:16Z")

</div>

Thanks!

I am slowly but surely getting the hang of this metaprogramming thing.

On Thursday, April 20, 2006, at 4:49 AM, Brian M. wrote:

> class \<\< self; alias meth\_a\_old meth\_a end  
> class A  
> sclass = class \<\< self; self end

\_Kevin
