Это определенно требует полиморфизма и, при желании, если вы хотите сделать его немного более элегантным, фабричный шаблон . Заводской шаблон не волшебство, он просто скрывает if
в красивой оболочке.
Почему бы не другой подход, такой как, например, std::variant
который в основном является union
замаскированным? Что ж, неплохо, если вы можете хранить разные вещи или даже любой вид (std::any
) под тем же именем, но это не очень полезно, так как вы также хочу сделать что-то значимое с объектом. Если вы хотите делать совершенно разные, не связанные между собой вещи, то у вас также могут быть разные объекты, ограниченные блоками if
(и с совершенно другим кодом). Если, однако, вы хотите делать одинаковые или похожие вещи на разных объектах, то они (обычно) должны быть одинакового или связанного типа.
Различные типы, как правило, не имеют одинаковых элементов данных или одинаковых общедоступных функций-членов. Таким образом, выполнение одного и того же действия на уровне исходного кода с разными типами обычно не работает (кроме как по совпадению).
Но если два класса имеют идентичные подмножества на своих интерфейсах, и вы хотите иметь возможность сделать это тем или иным способом взаимозаменяемо, то наследование от базового класса является наиболее естественным и идиоматическим вещь которую нужно сделать. Для этого и был изобретен полиморфизм. Используйте идиоматическую вещь.
(Вы можете получить один и тот же чистый эффект от вызова функций с одним и тем же именем для разных, не связанных между собой типов через помощника по шаблону и предположить, что имена, которые вы используете, существуют, которые будут просто работать , но это не такой хороший стиль, и он вызывает огромное раздутие, дважды создавая функцию).
Взгляните на Win32API
stdlib. Это довольно простой (но непонятный) интерфейс для Windows 32 API или DLL.
Документация находится здесь , некоторые примеры здесь . Чтобы дать вам почувствовать вкус:
require "Win32API"
def get_computer_name
name = " " * 128
size = "128"
Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size)
name.unpack("A*")
end
Я думаю, вы также можете использовать ruby / dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
или ffi упрощает и упрощает взаимодействие с виртуальными машинами: