Хорошее правило: если нужна категория поведения или свойств, общая для объектов, но неудобная для наследования, используйте интерфейс. Если наследование имеет смысл, но вам не нужен конкретный класс-предок, используйте абстрактный класс. (А если вы хотите создавать экземпляр класса-предка, то лучше использовать обычный класс.)
Мы рекомендуем использовать аргумент по умолчанию, когда для соответствующего параметра существует типичное входное значение. Для аргументов с большим разбросом значений или для аргументов, имеющих много разумных значений по умолчанию, мы не советуем задавать аргумент по умолчанию. Кроме того, иногда лучше требовать обязательной передачи параметра, чтобы сделать его более очевидным, чем стремиться к компактному вызову функций.