Brian Marick
12/13/2007 2:50:00 AM
> On Dec 12, 5:10 pm, "Tim Rowe" <n...@digitig.co.uk> wrote:
>> What's the Ruby way to define a class that shouldn't be
>> instantiated, but
>> with descendants that can be? Other than a comment in the
>> documentation, of
>> course.
>>
I missed the beginning, so hope this response is to the point. See the
code below. (What I do is name the class AbstractSomething and trust
that's warning enough.)
=================================
class Abstract
attr_reader :abstract_class_initialize_args
def initialize(*args)
raise "Initialized abstract class #{self.class}" if self.class ==
Abstract
@abstract_class_initialize_args = args
end
end
class SubclassWithInitializer < Abstract
attr_reader :subclass_initialize_arg
def initialize(arg)
super
@subclass_initialize_arg = arg
end
end
class SubclassWithoutInitializer < Abstract
end
require 'test/unit'
class TestCase < Test::Unit::TestCase
def test_abstract_class_raises_exception
assert_raises(RuntimeError) { Abstract.new }
end
def test_a_subclass_can_call_super
sub = SubclassWithInitializer.new('arg')
assert_equal(['arg'], sub.abstract_class_initialize_args)
assert_equal('arg', sub.subclass_initialize_arg)
end
def test_a_subclass_need_not_define_its_own_initialize
sub = SubclassWithoutInitializer.new('arg')
assert_equal(['arg'], sub.abstract_class_initialize_args)
end
end
-----
Brian Marick, independent consultant
Mostly on agile methods with a testing slant
www.exampler.com, www.exampler.com/blog, www.twitter.com/marick