Наследование классов типа множественного наследования в рубине

Вам будет нужен Менеджер конфигурации SQL Server. Перейдите к Собственной Клиентской Конфигурации Sql, Избранным Клиентским Протоколам, Щелкните правой кнопкой по TCP/IP и установите свой порт по умолчанию там.

6
задан cloudhead 7 July 2009 в 22:14
поделиться

4 ответа

На самом деле это довольно просто с использованием Ruby:

module Slugish
  attr_accessor :slug
  def loud_slug
    "#{slug}!"
  end
end

class Stringy < String
  include Slugish
end

class Hashy < Hash
  include Slugish
end

hello = Stringy.new("Hello")
world = Stringy.new("World")

hello.slug = "So slow"
world.slug = "Worldly"

hello.loud_slug      #=> "So slow!"
world.loud_slug      #=> "Worldly!"

hello.is_a?(Slugish) #=> true
world.is_a?(Slugish) #=> true

"#{hello} #{world}"  #=> "Hello World"

stuff = Hashy.new
stuff[:hello] = :world
stuff.slug = "My stuff"
stuff.loud_stug      #=> "My stuff!"
stuff.is_a?(Slugish) #=> true
13
ответ дан 8 December 2019 в 13:01
поделиться

Эквивалент множественного наследования в Ruby - это примеси. Мне кажется, что вы хотите, чтобы Base был модулем, который смешивается с несколькими классами.

1
ответ дан 8 December 2019 в 13:01
поделиться

Почему вы настаиваете на использовании is_a? / Kind_of? когда response_to? это более чистый способ проверки? Вы хотите, чтобы объекты, реализующие интерфейс / контракт, не были подклассом любого произвольно выбранного суперкласса. Но, возможно, мне здесь не хватает какого-то требования.

Изменить : Я понимаю ваши рассуждения, но это часто приводит к плохому объектно-ориентированному / динамическому дизайну. Либо ты делаешь что-то подобное, что может быть приемлемой идеей в листовых классах, но в структуре должно быть решено с помощью наследования:

if a.is_a?(something)
   #do something
elif a.is_a?(something_else)
   #do something else
...

или что-то вроде этого:

if !a.is_a?(something)
   #raise condition/return null/etc.
endif 
...

Я думаю, что если код сбой с не понимает исключение при передаче сообщений основанный на языке язык - прекрасное дизайнерское решение.

В качестве дополнительной проблемы использование is_a? вместо response_to? ограничивает вашу способность использовать макеты объектов при модульном тестировании. Что может быть довольно большой проблемой даже для умеренно сложного кода.

использование is_a? вместо response_to? ограничивает вашу способность использовать макеты объектов при модульном тестировании. Что может быть довольно большой проблемой даже для умеренно сложного кода.

использование is_a? вместо response_to? ограничивает вашу способность использовать макеты объектов при модульном тестировании. Что может быть довольно большой проблемой даже для умеренно сложного кода.

3
ответ дан 8 December 2019 в 13:01
поделиться

Я думаю, вы неправильно используете наследование, если у вас есть совершенно несвязанные классы, такие как «Number» и «Color», все производные от одного и того же базового класса. Я бы использовал композицию вместо этого, если им действительно нужен доступ к одним и тем же подпрограммам (хотя не знаю, зачем им это нужно).

1
ответ дан 8 December 2019 в 13:01
поделиться