Подтвердить что ты не робот

Многократное наследование в Ruby?

Я думал, что Ruby допускает одиночное наследование, кроме mixin. Однако, когда у меня есть класс Square, который наследует класс Thing, Thing по умолчанию наследует Object по умолчанию.

class Thing
end

class Square < Thing
end

Не означает ли это множественное наследование?

4b9b3361

Ответ 1

Я думаю, что вы неправильно воспринимаете значение множественного наследования. Возможно, что вы имеете в виду, поскольку множественное наследование выглядит следующим образом:

class A inherits class B
class B inherits class C

Если да, то это неправильно. Это не то, что множественное наследование, и у Ruby нет проблем с этим. На самом деле это многократное наследование:

class A inherits class B
class A inherits class C

И вы, конечно же, не можете сделать это в Ruby.

Ответ 2

Нет, множественное наследование означает, что один класс имеет более одного родительского класса. Например, в ruby ​​вы можете иметь такое поведение с такими модулями, как:

class Thing
  include MathFunctions
  include Taggable
  include Persistence
end

Итак, в этом примере класс Thing имел бы некоторые методы из модуля MathFunctions, Taggable и Persistence, что было бы невозможно с помощью простого наследования классов.

Ответ 3

Если класс B наследуется от класса A, то экземпляры B имеют поведение как класса A, так и класса B

class A
end

class B < A
  attr_accessor :editor
end

Ruby имеет одно наследование, т.е. каждый класс имеет один и только один родительский класс. Ruby может имитировать множественное наследование с использованием модулей (MIXIN)

module A
  def a1
  end

  def a2
  end
end

module B
  def b1
  end

  def b2
  end
end

class Sample
  include A
  include B

  def s1
  end
end


samp=Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

Модуль А состоит из методов a1 и a2. Модуль B состоит из методов b1 и b2. Образец класса включает в себя оба модуля A и B. Образец класса может обращаться ко всем четырем методам, а именно a1, a2, b1 и b2. Поэтому вы можете видеть, что класс Sample наследуется от обоих модулей. Таким образом, вы можете сказать, что класс Sample показывает множественное наследование или mixin.

Ответ 4

Множественное наследование - Это абсолютно невозможно в рубине даже с модулями.

многоуровневое наследование - Это то, что возможно даже с модулями.

Почему?

Модули действуют как абсолютные суперклассы класса, который включает их.

Ex1:

class A
end
class B < A
end

Это нормальная цепочка наследования, и вы можете проверить это предками.

B.ancestors = > B → A → Object → ..

Наследование с помощью модулей -

Ex2:

module B
end
class A
  include B
end

цепочка наследования для примера выше -

B.ancestors = > B → A → Object → ..

Это точно так же, как и Ex1. Это означает, что все методы в модуле B могут переопределять методы в A, и он действует как наследование реального класса.

Ex3:

module B
  def name
     p "this is B"
  end
end
module C
  def name
     p "this is C"
  end
end
class A
  include B
  include C
end

A.ancestors = > A → C → B → Object → ..

если вы видите последний пример, даже если включены два разных модуля, они находятся в одной цепочке наследования, где B - суперкласс C, C - суперкласс A.

так,

A.new.name => "this is C"

если вы удалите метод имени из модуля C, выше код вернет "это B". который аналогичен наследованию класса.

так,

В любой точке существует только одна многоуровневая цепочка наследования в ruby, что сводит на нет наличие множественного прямого родительского класса.