Многократное наследование в Ruby?
Я думал, что Ruby допускает одиночное наследование, кроме mixin. Однако, когда у меня есть класс Square
, который наследует класс Thing
, Thing
по умолчанию наследует Object
по умолчанию.
class Thing
end
class Square < Thing
end
Не означает ли это множественное наследование?
Ответы
Ответ 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, что сводит на нет наличие множественного прямого родительского класса.