[#3109] Is divmod dangerous? — Dave Thomas <Dave@...>

14 messages 2000/06/06

[#3149] Retrieving the hostname and port in net/http — Roland Jesse <jesse@...>

Hi,

12 messages 2000/06/07

[#3222] Ruby coding standard? — Robert Feldt <feldt@...>

16 messages 2000/06/09

[#3277] Re: BUG or something? — Aleksi Niemel<aleksi.niemela@...>

> |I am new to Ruby and this brings up a question I have had

17 messages 2000/06/12
[#3281] Re: BUG or something? — Dave Thomas <Dave@...> 2000/06/12

Aleksi Niemel<aleksi.niemela@cinnober.com> writes:

[#3296] RE: about documentation — Aleksi Niemel<aleksi.niemela@...>

> I want to contribute to the ruby project in my spare time.

15 messages 2000/06/12

[#3407] Waffling between Python and Ruby — "Warren Postma" <embed@...>

I was looking at the Ruby editor/IDE for windows and was disappointed with

19 messages 2000/06/14

[#3410] Exercice: Translate into Ruby :-) — Jilani Khaldi <jilanik@...>

Hi All,

17 messages 2000/06/14

[#3415] Re: Waffling between Python and Ruby — Andrew Hunt <andy@...>

>Static typing..., hmm,...

11 messages 2000/06/14

[#3453] Re: Static Typing( Was: Waffling between Python and Ruby) — Andrew Hunt <andy@...>

32 messages 2000/06/16

[#3516] Deep copy? — Hugh Sasse Staff Elec Eng <hgs@...>

Given that I cannot overload =, how should I go about ensuring a deep

20 messages 2000/06/19

[#3694] Why it's quiet — hal9000@...

We are all busy learning the new language

26 messages 2000/06/29
[#3703] Re: Why it's quiet — "NAKAMURA, Hiroshi" <nahi@...> 2000/06/30

Hi,

[#3705] Re: Why it's quiet — matz@... (Yukihiro Matsumoto) 2000/06/30

Hi,

[ruby-talk:03538] Re: Ruby classes and inheritance

From: Dave Thomas <Dave@...>
Date: 2000-06-20 01:29:41 UTC
List: ruby-talk #3538
matz@netlab.co.jp (Yukihiro Matsumoto) writes:

> |There does not seem to be any parallel concept in
> |Ruby. On the other hand, maybe I don't need it.
> 
> Since Ruby is a dynamic typed language, you don't NEED pure virtual
> member functions.  But if you want to describe the need for
> redefinition of a method implicitly by a program, you can, for
> example:
> 
>   def must_be_redefined()
>      raise NotImplementError, "should be redefined"
>   end

I agree that you probably don't need it--in fact, overcoming the
notion that I need to implement classes hierarchically is one of the
things I find most difficult about Ruby. At the end of the day, if an
object responds to the right messages, it can play.

However, it's fun to think about implementing abstract base classes,
just to see how it could be handled.


One way is to make the abstract base class a module, and include it in 
any class that implements that interface. Let's invent a new 'keyword' 
to specify the names of the methods in that base class.


    module AbstractStack
      abstract :push, :pop
    end

So here we've created our abstract base class (as a module). Lets
create an implementation.

  
    class ConcreteStack
      include AbstractStack
      # ...
    end

And try it

    c = ConcreteStack.new
    c.push(1)

 #=>
    (eval):1:in `push': push not implemented (NotImplementError)
	from -:23

Excellent - we didn't implement push, so we got a message.


So now all that's left is to implement this new-fangled 'abstract'
thing. We do that by adding a method to class Module. These methods
are then available during module definition:

    class Module
      def abstract(*names)
        for name in names
          class_eval %{def #{name}(*a)
                         raise NotImplementError, "#{name} not implemented"
                       end}
        end
      end
    end


And that's it.


One of the benefits of implementing the abstract bases in modules is
that you can mix in as many as you want: you get multiple inheritance
from base classes.

And the neat thing about Ruby is that your can effectively extend the
language this way, all in Ruby.


Regards



Dave

In This Thread