Nano Hash - криптовалюты, майнинг, программирование

расширить класс значение по умолчанию родительского параметра

У меня есть класс B с параметрами x и y, расширенный из класса A с параметром x, который является необязательным (все параметры не равны нулю), как я могу определить B таким образом, чтобы он был необязательным, и он будет использовать необязательное значение в конструкторе из A

val y = 0
val b = if (y == 0) B(y) else B(y, 0)

class B(y: Int, x: Int = 238) : A(x)

open class A(x: Int = 238)

здесь я установил значение по умолчанию для x в конструкторе B есть ли способ добиться этого без необходимости устанавливать значение по умолчанию в B


Ответы:


1

Подход, предложенный в ответе @Januson, очень хорош и чист, когда вы не хотите/не определяете первичный конструктор в подклассе B. Если вы попытаетесь сделать это, вы получите ошибки компилятора, поскольку вспомогательные конструкторы должны вызывать основной конструктор и не могут напрямую вызывать конструкторы суперкласса.

Если подклассу B необходимо определить первичный конструктор, вы можете подойти к проблеме определения значения по умолчанию как константы в сопутствующем объекте класса A и использовать его в первичных конструкторах классов A и B следующим образом:

open class A(val x: Int = DefaultX) {
    companion object {
        val DefaultX:Int = 238;
    }
}

class B(y: Int, x: Int = DefaultX) : A(x)

Таким образом вы определяете эквивалент переменной Java static final с областью видимости A.

Вы должны ссылаться на константу A.DefaultX суперкласса в подклассе B, но вам не нужно дублировать ее значение как в классе A, так и в классе B...

21.02.2019
  • Пьетро Мартинелли, поскольку у меня есть несколько уровней наследования, определяющих значение по умолчанию в качестве метода или поля компании, сделайте мой код чище, но с точки зрения производительности, я думаю, что решение @Januson немного более эффективно (это не так уж много в любом случае: D) в любом случае для этого я иду на уборку 21.02.2019
  • @PietroMartinelli Буду признателен за ваше мнение о моем ответе. 26.10.2019

  • 2

    Вы можете добиться этого с помощью вторичных конструкторов.

    class B : A {
        constructor(y: Int): super()
        constructor(y: Int, x: Int): super(x)
    }
    

    Для получения дополнительной информации см. Документацию Kotlin.

    Редактировать:

    Как упоминает @PietroMartinelli, вторичные конструкторы не будут работать, если вам нужен первичный конструктор. Если производный класс имеет первичный конструктор, базовый класс можно (и нужно) инициализировать тут же, используя параметры первичного конструктора.

    21.02.2019
  • Этот подход не работает, когда вам нужно (или нужно) определить непустой первичный конструктор в подклассе B, не так ли? 21.02.2019
  • @PietroMartinelli Это правда. С первичным конструктором класс должен быть инициализирован сразу, поэтому это не сработает. 21.02.2019
  • Хорошо, в любом случае это хороший подход, если вам не нужен первичный конструктор ;-) 21.02.2019

  • 3

    В вашей ситуации что-то вроде этого может вам помочь!

    val y = 0
    val b = if (y == 0) B(y) else B(y, 0)
    
    class B(y: Int, x: Int) : A() {
        constructor(y: Int) : this(y, if (y == 0) 238 else 0)
    }
    
    open class A(x: Int = 238)
    
    26.10.2019
  • @Januson Буду признателен за ваше мнение. 26.10.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..