2013-06-19 6 views
3

Что происходит, когда я делаю что-то вроде этого:Передача объектов в другой класс в Perl

$stallion = Horse->new(gender => "male"); 
$molly = Mule->new(gender => "female"); 
$colt = $molly->breed($stallion); 

Я не могу понять, что происходит в этом коде?

  1. Что происходит, когда эта ссылка на героя передается другому экземпляру класса?
  2. И в этом коде порождает другой метод в другом классе?
  3. Из этого примера существуют 2 разных класса? (Класс лошади с новым методом или конструктором, класс Mule с другим новым конструктором).

    $ colt = $ molly-> breed ($ stallion);

Из этого кода, я понимаю, что $molly точно такой же, как Mule класса, которые имеют другой метод, чем new - breed. Я прав?

+2

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

+0

@tchrist - отходит от книг Perl до линии животноводства? :) – DVK

+1

@ Nelmark- «$ molly - это то же самое, что и класс Mule» - № $ molly - это ** объект ** класса «Мул». – DVK

ответ

3

Из этого примера существуют 2 разных класса? (Класс лошади с новым методом или конструктором, класс Mule с другим новым конструктором).

Совершенно верно.

В любое время вы видите выражение STRING_LITERAL->METHOD_NAME(), что STRING_LITERAL почти гарантированно будет именем класса.

И когда вы видите STRING_LITERAL->new(), , если человек, который написал код решил быть слишком умным для их собственного блага, это будет призыв к этому классу конструктор, возвращающий объект этого класса. (Тем не менее, «новый», являющийся конструктором, является просто добровольным соглашением, в Perl нет ничего, что обеспечивало бы это - кто-то слишком умный/немой МОЛИТЬ определил «new()» sub, чтобы вернуть значение 2+3 - у вас нет никакой гарантии в сторону глядя на код и тестирование)

После этого примера, вы получите, надеюсь:

  • $ жеребец - держит значение, возвращенное из конструктора класса Horse - будет иметь в качестве значения объекта класса Лошадь.

  • $ molly - удерживая значение, возвращаемое из конструктора класса Mule, будет иметь в качестве значения объект класса Mule.


Что происходит, когда эта ссылка жеребец передается другому конкретизации класса?

  • Что происходит в $molly->breed($stallion); вызов, - как ответили на вчерашнем вопросе, это объект способ вызова метода, так что вы делаете:

    • Создать список параметров (в этом случае $ жеребец)
    • Prepend объект к нему, в результате чего ($ Molly, $ жеребца)
    • Пасса этого списка breed() подпрограммы, которые, конечно, должны быть определены в классе т Объект hat $ molly принадлежит (например, быть методом в классе Mule)
    • Внутри breed() подпрограмма, специальная переменная списка @_ будет сглажена элементам этого списка параметров ($ molly, $ stallion).
    • Что произойдет, то 100% зависит исключительно от того, как код «породы» подразделам написано

И в том, что код породы другой метод в другом классе?

Как было отмечено в пункте пули выше, да, если $ Molly является объектом определенного класса (Mule), выражение $molly->METHOD_NAME() средства вызова метода с таким именем, который известен (определенным или унаследованным от родительского класса), в классе которого $ molly является объектом.

+1

«определено в классе» или в суперклассе этого класса – ysth

+0

<< Что происходит, тогда на 100% полностью зависит от того, как написан код для «породы» субтитров ... ... да, мы знаем, как **, что ** продолжается ... ;-) – Massa

+0

@ysth - технически корректный, но, возможно, слишком глубокий для OP, который вчера сказал, не знает никакого ООП. – DVK