1
 class Bike
   attr_reader :gears

   def initialize(g = 5)
     @gears = g
   end
 end

class AnotherBike < Bike
  attr_reader :seats

  def initialize(g, s = 2)
    super(g)
    @seats = s
  end
end

引数が指定されていない場合、スーパーから「ギア」のデフォルト値を取るAnotherBikeインスタンス「AnotherBike.new」を作成することは可能ですか?

だから例えば

my_bike = AnotherBike.new  
...
my_bike.gears #=> 5
my_bike.seats #=> 2

my_bike = AnotherBike.new(10)  
...
my_bike.gears #=> 10
my_bike.seats #=> 2

my_bike = AnotherBike.new(1,1)  
...
my_bike.gears #=> 1
my_bike.seats #=> 1

Ruby 1.9.3 を使用しています。

4

4 に答える 4

1

引数の順序を変更して、もう少しエレガントにすることができます

class AnotherBike < Bike
  attr_reader :seats

  def initialize(s = 2, g = nil)
    g ? super(g) : super()
    @seats = s
  end
end

AnotherBike.new()
AnotherBike.new(4)
AnotherBike.new(4, 6)

あなたの例をサポートするために@Matziの答えは大丈夫です

于 2013-02-19T13:00:45.547 に答える
1

クラス:

class AnotherBike < Bike
  attr_reader :seats

  def initialize(g = nil, s = 2)
    g ? super() : super(g)
    @seats = s
  end
end

使用法:

AnotherBike.new(nil, 13)

動作するはずですが、これは少し冗長になる可能性があります。

于 2013-02-19T12:53:35.093 に答える
0

私は実際の質問から少し離れすぎているかもしれませんが、継承の代わりに構成を使用することで利益が得られるようです。文脈がどうなのかはわからないけど。

class Gears
  def initialize(count = 5)
    @count = count
  end
end

class Seats
  def initialize(count = 2)
    @count = count
  end
end

class Bike
  def initialize(gears, seats)
    @gears = gears
    @seats = seats
  end
end
于 2013-02-19T13:07:26.567 に答える
0

代わりにハッシュを送信しないのはなぜですか?

class Bike
   attr_reader :gears

   def initialize(attributes)
     @gears = attributes.delete(:g) || 5
   end
 end

class AnotherBike < Bike
  attr_reader :seats

  def initialize(attributes)
    @seats = attributes.delete(:s) || 2
    super(attributes)
  end
end

次のように呼び出す必要があります。AnotherBike.new({:g => 3, :s => 4})

于 2013-02-19T12:54:15.360 に答える