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

Передача обязательных данных в суперклассы в Котлине

У меня проблема с созданием сущностей в Котлине. В частности, речь идет о передаче данных в суперкласс. Найдите пример ниже.

У меня есть абстрактный суперкласс под названием Trackable, который классы могут расширять. У него есть свойство user, в котором хранится информация о том, кто создал этот конкретный объект.

abstract class Trackable(
  var createdBy: User
) : Persistable() 

Класс с именем Contract теперь будет реализовывать суперкласс Trackable с ошибкой времени компиляции на данный момент:

@Entity
data class Contract(
  var creationDate: LocalDateTime
) : Trackable() // compile error, no user passed here

Итак, поскольку User является обязательным полем в Trackable, я должен передать объект User конструктору Trackable. Первым, что пришло мне в голову, было создание временного свойства под названием creator, которое я передаю в Trackable.

@Entity
data class Contract(
  @Transient val creator: User,
  var creationDate: LocalDateTime
) : Trackable(creator) 

Однако с точки зрения домена это кажется очень грязным решением, поскольку оно загрязняет мой Contract.

Недавно начав с Kotlin, мне все еще не хватает подходящих и разумных шаблонов для использования. Может ли кто-нибудь помочь мне с этим?


  • Что вы имеете в виду под: это загрязняет мой Контракт? 28.07.2018
  • Я имею в виду, что каждый параметр конструктора, который я добавляю в класс с префиксом data, будет генерировать свойство класса с соответствующим геттером. И я просто хочу, чтобы класс содержал принадлежащие ему свойства, а не те, которые мне просто нужно передать в Trackable. 29.07.2018

Ответы:


1

Классы данных не работают лучше всего с наследованием, может быть лучше использовать композицию, но если вы действительно хотите использовать наследование, то ИМХО лучший способ сделать это следующим образом:

Объявить абстрактный класс с абстрактными полями:

abstract class Trackable : Persistable(){
    abstract var createdBy: User

}

Расширить абстрактный класс и переопределить свойство внутри класса данных:

data class Contract(
        override var createdBy: User,
        var creationDate: LocalDateTime) : Trackable()

Таким образом, вы избегаете дублирования свойства, имея возможность доступа к этому свойству из класса parent, но на самом деле оно является членом класса children, с моей точки зрения, это лучшее решение, поскольку вы сохраняете все преимущества data class, но относитесь к нему с недоверием, поскольку оно субъективен.

28.07.2018
  • Мне действительно не нужно использовать наследование, я просто привык к этой конкретной проблеме, которая у меня есть. Большое спасибо за предложение решить это путем наследования, но я думаю, что более разумно переосмыслить разные шаблоны, например. состав, как вы процитировали, тоже. 29.07.2018
  • Новые материалы

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

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

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

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

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

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

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