Просто добавить немного к ответу Серхио с точки зрения его комментария об использовании композиции над наследованием и обмена в комментариях.
Вместо того, чтобы говорить, что MyArray - это массив, вы можете сказать, что MyArrayLike имеет и массив.
Затем вы можете «перенаправить» методы, которые имеют смысл, в базовый массив, но при этом добавить собственную функциональность, которая имеет смысл для вашего класса без массива подклассов.
В Ruby даже есть несколько способов сделать это очень просто, включая модуль Forwardable .
class MyArrayLike
attr_reader :arr
def initialize( initial_arr )
@arr = initial_arr
end
def +(other)
result = self.class.new(arr + other.arr)
# maybe you want to do more than just concat the underlying array, if so you can do it here
result
end
def first
# for example maybe you want first to just return the first item in the underlying array.
arr.first
end
end
a = MyArrayLike.new([1,2,3])
b = MyArrayLike.new([4,5])
puts "a.class = #{a.class}"
# => a.class = MyArrayLike
puts a
# => #<MyArrayLike:0x00000000dc4b00>
a += b
puts "a.class = #{a.class}"
# => a.class = MyArrayLike
puts a
# => #<MyArrayLike:0x00000000dc4470>
puts a.first
# => 1
puts a.arr
# => 1
# 2
# 3
# 4
# 5