岩月と申します。

05/11/03 に Hideo Konami<konami / kyoto-wu.ac.jp> さんは書きました:
> そのあと,たとえば次のような形でこれらのオブジェクト間の演算
> を定義することはできるでしょうか.
>
> babycat = mike + tama

演算子のメソッドを定義して、そのメソッド内で新たにインスタンスを作ります。

class Num
  attr_reader(:num)

  def initialize(num)
    @num = num
  end

  def +(other)
    # Num.newでも可
    self.class.new(@num + other.num)
  end
end

a = Num.new(1)
b = Num.new(2)
a + b
# => #<Num:0x100f6390 @num=3>

> ここで Cat クラスに属する2個のオブジェクト同士の + の演算は,
> mike と tama の性質から導かれるもので,たとえば上記のように
> して両親の性質をまぜた子猫を作るものとします.

性質の混ぜ方さえわかれば実装可能だと思います。
以下はかなり適当ですが、実装例ということで(^^;)。

class Cat
  attr_reader(:name, :age, :sex)

  def initialize(name, age, sex)
    @name, @age, @sex = name, age, sex
  end

  def +(other)
    self.class.new(@name + other.name, 0.0, rand(2).zero? ? "M" : "F")
  end
end

mike = Cat.new("みけ",4.5,"F")
tama = Cat.new("たま",3.8,"M")
mike + tama
# => #<Cat:0x100f56b8 @sex="M", @age=0.0, @name="みけたま">

> puts Cat.fight(mike,tama)
>
> みたいな形で,mike, tama のもつ性質を利用して勝ち負けを決めて
> "みけの勝ち!" といった出力を得るようにすることはできる
> でしょうか.

判定する基準さえあれば実装可能だと思います。
提示された形でいくと、クラスメソッドを用意すればよいのでしょうか。

class Cat
  # 年長者の勝ち(適当すぎ)
  def self.fight(a, b)
    if a.age > b.age
      a
    elsif a.age < b.age
      b
    else
      nil # 引き分け
    end
  end
end

Cat.fight(mike, tama)
# => #<Cat:0x100f5160 @sex="F", @age=4.5, @name="みけ">

--
IWATSUKI Hiroyuki <URL:mailto:don / na.rim.or.jp>