Предположим, у меня есть интерфейс, который предоставляет множество неизменяемых свойств с получателями по умолчанию, например:
interface Repository {
val name : String
val pattern : String
get() = "foo/bar/baz"
var url : String
get() = "http://mycompanyrepo.com/$name"
fun add() {
TODO("do something interesting here")
}
}
Теперь есть несколько конкретных реализаций, которые просто используют большинство значений по умолчанию.Однако я также хочу предоставить ConfigurableRepository
, который обеспечивает большую гибкость в других проектах, которые хотят настроить это во время выполнения, основываясь на других пользовательских параметрах.
Как я могу создать первичный конструктор с необязательными параметрами?
Я надеялся что-то вроде:
class ConfigurableRepo(var name, var pattern, var url) {
...
}
Отредактировано для пояснения
Намерение здесь состоит в том, чтобы использовать первичное поведение конструктора, где именованные параметры являются необязательными.Точнее, name
, pattern
и url
являются необязательными для всех, кто вызывает конструктор, и по умолчанию они будут получать геттеры интерфейса.Но я, очевидно, пытаюсь заставить Kotlin interface
соответствовать этой модели, и это, вероятно, ошибка пользователя Kotlin noob, поскольку у меня в конечном счете нет доступа к super здесь.
Из класса docs
Фактически, для объявления свойств и их инициализации из основного конструктора, Kotlin имеет краткий синтаксис:
class Person(val firstName: String, val lastName: String, var age: Int) {
// ...
}
Я, кажется, получаюошибки, которые скрывают члены супертипа и требуют модификатор override
.Если я пытаюсь переопределить супертип и затем указать значение по умолчанию, он жалуется, что в этом контексте супертипы недоступны.
Можно ли это сделать только во вторичном конструкторе с изменяемыми значениями?
Я также открыт для предложений / отзывов о лучших способах предоставления интерфейса, который поддерживает конфигурациюсверх соглашения.Наиболее важным аспектом является то, что интерфейс всегда предоставляет значения по умолчанию для соглашения.Или, проще говоря:
Есть ли лучший способ?