ООП реализация предметов в комнате

Всем привет. Есть такая задача: есть класс, пусть будет Item. Он является родительским классом для всех предметов в комнате и имеет какие-то общие методы - Take(), CreateDust() и т.д. Также есть классы для разные предметов - Chair, TV, Box. Помимо того, что они могут иметь разные реализации родительских методов, они могут иметь и свои уникальные - допустим, метод GetContent() для класса Box и SetEnabled() для TV. Есть также класс Room, который хранит массив Item items[] и каждый тик проходится в цикле по этому массиву и совершает некоторые действия.

И наконец, перейдём непосредственно к вопросу. Как реализовать выполнение методов дочерних классов, если храним мы только Item? У меня было несколько вариантов:

1. Создать несколько массивов, где хранить именно дочерние классы (Chair, TV, Box), заполнять их при инициализации комнаты и проходиться в цикле по ним

2. Использовать оператор is внутри общего цикла, получать нужный дочерний класс и работать с ним

3. Создавать виртуальные методы (GetContent(), SetEnabled()) в родительском классе, переопределять их в дочерних и в общем цикле вызывать эти методы через родительский класс, но что-то делать они будут только если это элемент нужного класса

Все эти способы мне не особо понравились. В первом много копипастов при создании и заполнении массивов, второй может быть слишком требовательный, а в третьем копипасты при создании виртуальных функций

Есть ли какие-то другие, более оптимальные способы, или нужно доработать один из моих?