#ruby #oop
#ruby #ооп
Вопрос:
module Vehicle
class Car < Wheeled
end
end
module Vehicle
class Bike < Wheeled
end
end
Чего пытается достичь этот шаблон создания классов, я не в состоянии понять. В чем будет недостаток выполнения этого путем включения Vehicle
в качестве модуля в другие классы?
Ответ №1:
При выполнении этого таким образом эти классы сохраняются в пространстве имен в Vehicle
модуле:
Car.new
# => NameError: uninitialized constant Object::Car
Vehicle::Car.new
# => #<Vehicle::Car:0x0000123456>
Таким образом, у вас также может быть отдельный Car
класс вне модуля, и Vehicle::Car
класс не будет вмешиваться.
Комментарии:
1. Спасибо! Это способ, которым мы следуем, когда нам нужны два класса с одинаковыми именами. Я не обнаружил создаваемого нового класса с тем же именем, что заставило меня задуматься, была ли какая-либо другая причина. Пожалуйста, дайте мне знать, если вы можете придумать какую-то другую причину для этого.
2. Конкретный код, который вы используете, может не иметь конфликта, но предположим, что вы используете этот код в проекте, который использует другие сторонние библиотеки. Если бы вы не указали пространство имен для классов, и в одной из этих сторонних библиотек также случайно оказался
Car
класс, не входящий в определенное пространство имен, возникли бы проблемы.
Ответ №2:
Этот шаблон группирует связанные некоторым образом классы в отдельное пространство имен для достижения более логичной структуры приложения и избежания конфликтов именования. Суперкласс-подкласс сильно отличается, хотя в вашем конкретном примере было бы лучше пойти этим путем, потому что автомобиль и велосипед — это оба вида транспортных средств, но есть много ситуаций, когда это не так. Например, широко используется группирование всех классов приложений в одном модуле.