Good work! The tools exist because not every tool is suited to every job. Sometimes interfaces aren’t the way to go!
But one thing to keep in mind - if your BP has any casts anywhere it will load the classes in each cast when the BP loads. Always. Whether your code hits that node or not doesn’t matter, that’s just the way BPs work.
Casts aren’t always evil, especially if the object you’re casting to already exists in memory. For example, your player character exists all the time, so it’s not an issue to cast to your player character from a collectible object. The game doesn’t need to load the same object multiple times. It may not have the class of the collectible loaded though. So it’s best not to cast to the collectible from your character class. If you do, it will load the collectible class when the player character’s class loads.
The thing is, when you overlap with a collectible object, your player character knows it overlapped with an object in the world, not specifically a collectible. It doesn’t have to load the collectible class. It only references the base AActor class which is already in memory anyway. It doesn’t have to worry about any functions or variables in the collectible class. But if you cast to the collectible, it has to already know about the class when the player is loaded. With an interface, you’re sending a message to an actor and the receiver, if it implements the interface, knows what to do from there. No extra memory overhead.