Вы не должны наследовать от String
, как по причинам хорошего объектно-ориентированного дизайна, так и чистого прагматизма.
Если вы наследуете от String
, вы нарушаете принцип подстановки Лискова, который гласит, что экземпляры подклассов должны заменять экземпляры их суперкласса. Это не тот случай: я могу вставить пробел в середине String
, но не могу вставить пробел в середине Tag
, поэтому Tag
не является заменой для String
и, следовательно, не должно быть подклассом.
И с чисто практической точки зрения: вы наследуете около 100 открытых методов экземпляра от String
. Вы действительно хотите провести аудит (и, возможно, переопределить) каждого из них , чтобы убедиться, что они не нарушают Tag
контракт?
Я бы предпочел сделать что-то вроде этого:
require 'facets/multiton'
class Tag
include Multiton
attr_reader :name
attr_accessor :description
private
def initialize name, description=nil
raise ArgumentError, 'Tag name cannot contain whitespace' if str =~ /\s/
self.name = name.to_s.dup.freeze
self.description = description unless description.nil?
end
attr_writer :name
def self.multiton_id name, description=nil
return name.to_s.downcase
end
end