Class design Help!

I have 3 classes ("Truck", "Semi", "Motorcycle") that all inherit from
the "Vehicle" class.
Each subclass has an attribute for "Wheels" that tells how many wheels
the vehicle has (I do not store these values in the database because
they will never change)

I'm wondering what is the preferred method for handling this? Right now
I have individual methods in each class for "Wheels":

For example:

class Truck
  def wheels
    4
  end
end

class Motorcycle
  def wheels
    2
  end
end

class Semi
  def wheels
    18
  end
end

Is there a better way??? Thanks

Maybe you have a particular limited set of vehicles but trucks I know have from 4 to 10 (or more) wheels and motorcycles have 2 or 3 wheels and Semi-trailer trucks have 10 to 20 (or more) wheels depending on application. I would store the number of wheels in the database.

Norm

Thanks for the Response Norm, That isn't necessary in this instance
though (all trucks will have 4 wheels). Should I just keep with what I
have?

I agree with Norm that this feels inauthentic - objects are typically
used to 'model' real world things and relationships, and I can see
lots of exceptions on your horizon :slight_smile:

In any case, I would probably do something like:

class Vehicle
  attr_accessor :wheel_count
end

class Truck < Vehicle
  def initialize(wheel_count = 4)
    @wheel_count = wheel_count
  end
end

... and so on.

I'd also recommend 'Practical Object-Oriented Design in Ruby'
( http://www.poodr.info/ ) for some good thoughts on this.

FWIW,

I originally tried to set it up that way and it works until I retrieve a
record from the database. I dont think it triggers the initialize
function. because I cant call the "wheels" method on an object after I
retrieve it.

Hassan Schroeder wrote in post #1110193:

Nice one!

What you suggested would work. My approach would be to have a vehicle class/table with the characteristics of the vehicle types just because I think STI is more bother than reward unless there are other things that you do not mention that would drive you in that direction. I prefer the simplest approach that will do what is needed. It makes it easier to pass it on to someone else and I am not as likely to forget why things are like they are.

Norm

Sorry, my bad for not explicitly saying that the approach above does
imply you're going to persist that attribute (which makes sense if the
value is variable).