2013-04-26 3 views
0

Я хочу, чтобы понять разницу между следующимиКакова наилучшая практика для расширения класса в Ruby?

module XYZ 
    class A 
    end 
    class B 
    end 
end 

ли класс C наследует как класс А и В, или я должен расширить его с помощью <?

module YZZ 
include XYZ 
    class C < A 
    end 
end 

Что происходит, когда я делаю следующее? Включает ли он теперь все классы или просто класс A?

module YZZ 
extend XYZ 
    class C < A 
    end 
end 
  • Каков наилучший способ расширить класс C от A?
  • Как я могу расширить класс C, используя как A, так и B?
  • Как я могу включить только класс A?
+1

Что вы имеете в своем втором и третьем блоках кода, недействительно Ruby. –

+0

Что недействительна? – amjad

+1

Вам не хватает имени модуля. Как 'module Hello; расширить XYZ end'. –

ответ

0

Объявление 1. да, C наследует как A и B, когда вы использование #include. #extend применяется к методам класса.

Объявление 2. class C < A, подумайте, что A является просто константой, которой присваивается объект экземпляра класса как значения. Итак, конечно, C становится его подклассом.

Объявление 3. Когда вы используете #extend внутри оператора 'module', self является самим модулем, а XYZ в основном включается в его класс сиглетона.

Что касается ваших трех пуленевых вопросов, в конце концов, я не понимаю первого. Что такое «расширить класс C от A»? Will class C < XYZ::A do? Что касается второго вопросительного вопроса, вы можете расширить C "используя как A, так и B" просто на C.extend(XYZ). Что касается «как вы можете включить только класс A», нет простого способа включить только часть модуля. Если вы планируете отдельно включать класс A, если у него есть своя забота о решении даже без B, поместите его в отдельный модуль и включите его. Это называется разделение проблем. Если вы просто хотите вишневый выбор, вы можете сделать:

module Something 
    A = XYZ::A 
end 

И у вас есть постоянная Something :: указательная к тому же классу, как XYZ :: A.

+0

Спасибо, Борис. «Что лучший способ расширить класс C от A?» Я имел в виду; могу ли я сделать C amjad

+0

Amjad, выбор между 'A' и' XYZ :: A' не имеет никакого отношения к 'extend'. Это всего лишь вопрос доступа к константам в Ruby. Огнестойкий способ пишет ':: XYZ :: A' (вроде как' \ xyz \ a'). 'XYZ :: A' работает до тех пор, пока пространство имен, из которого вы вызываете, не имеет другой константы' XYZ'. 'A' работает только тогда, когда вы лексически находитесь в том же пространстве имен, что и тот, где A определен. Найдите больше учебных материалов по доступу к константам Ruby, здесь недостаточно места для изложения. –

0

Это должно работать:

module XYZ 
    class A 
    end 
    class B < A 
    end 
end 

Тогда для включения модуля XYZ и расширения C от A:

module ABC 
include XYZ 
    class C < A 
    end 
end 
Смежные вопросы