It prevents you from overriding other classes. Say you want to create a custom elytra - well, you have to override ItemElytraWings(or whatever it's called) since minecraft uses a lot of instanceof checks. With your ItemBase though you can't. And now you have to duplicate your code for no good reason.
It is not needed. You are just creating extra classes for no good reason. Why do you need it? Everything is now passed to the constructor via the corresponding Properties object and setRegistryName already returns you your object so you can chain it. It serves no purpose apart from enforcing cargo-cult programming.
In general you shouldn't abuse inheritance just to write less code, that's not what inheritance is for. If you really need it create a helper method:
public static <T extends IForgeRegistryEntry<T>> T setCommonParameters(T object, String registryName)
{
return object.setRegistryName(new ResourceLocation(TestMod.MODID, registryName));
}
// In your registry handler
event.getRegistry().register(setCommonParameters(new Item(new Item.Properties()), "test_item"));
But even this is not needed since you can just do
event.getRegistry().register(new Item(new Item.Properties().group(GroupsRef.GROUP_TEST_MOD)).setRegistryName(NAME_VOID_INGOT));