как получить доступ к сопутствующему объекту из экземпляра объекта в kotlin?

Простой класс образца с сопутствующим объектом

class MyClass{ companion object{ val test = 25 } } 

К тестированию значений можно получить доступ с помощью MyClass.test , но как получить доступ к экземпляру MyClass? Если у меня есть val sample = MyClass() , как мне получить доступ к тесту из образца? sample::class.test не верна …. есть ли способ?

Возникает вопрос: «Почему бы просто не использовать MyClass.test»?

Я предпочитаю, чтобы вопрос был «как», а не «почему», но поскольку он был задан, я попробую «почему». То же самое можно было бы применить и к методам. Почему бы не статические функции в классе и просто вызвать Class.function () и передать объект в качестве одного из параметров?

Рассмотрим при работе с объектом, прошедшим как более абстрактный базовый класс, с несколькими классами для объекта, с которым вы работаете.

Вы можете сделать коммутатор и для каждого класса класса и получить доступ к значению (или функции) из соответствующего класса, но идея полиморфизма заключается в том, что вы должны иметь доступ к атрибутам класса, таким как метод (даже если код метода функции для всех членов одного класса) или значение, общее для всех членов класса, из экземпляра объекта этого класса.

Мое решение до сих пор заключается в том, чтобы просто реализовать эквивалент MyClass in с тестом как статический

 public class MyClass { static Integer test = 25; public Integer testGetter(){ return test;} } 

Есть простые решения для этого в Java, C ++, python и т. Д. (Я дам примеры кода для каждого, что помогает), и я думаю, что в kotlin будет лучшее решение, чем при использовании Java.

Сопутствующий объект kotlin предоставляет альтернативу (и с преимуществами) статическому для ситуаций, в которых доступ к атрибутам класса осуществляется без экземпляра объекта (например, фабрик), но есть другое использование статического для случаев, когда хотя экземпляр объекта может быть доступен, static является подходящим, поскольку один атрибут может быть общим для всех членов класса, и атрибут не зависит от экземпляра.

Используя отражение, вы можете перейти через companionObject :

 sample::class.companionObject?.memberProperties?.find { it.name == "test" } 

Проблемы состоят в том, что, хотя свойства объекта доступны извне класса, если они не являются общедоступными, но свойств объекта-компаньона нет. Это означает добавление getters (и, если это необходимо) для любых свойств объекта сопутствующего объекта, которые будут доступны извне в класс.

 class MyClass{ companion object{ val test = 25 } var staticTest get() = test // getter for test } 

то все, что необходимо для доступа, это ::

 sample.staticTest 
Intereting Posts
Kotlin Generics: Котлин не признает мой класс с правильным наследованием «Нормальный» Котлин и Котлин для андроида отличаются? Повторный набор API-вызовов: как убедиться, что после вызова api значение не равно нулю? Кинжал пропускает генерацию Factory для модуля Google Services при использовании kapt Потребитель, играющий странно в Котлине Kotlin: цикл через отфильтрованный (возможно, пустой и не более одного элемента) список Ошибка исключения исключения в асинхронном вызове Anko (Kotlin) Вход Kotlin как BigInteger В чем разница между нормальным классом и классом данных в котлине Значение параметра Proto3, равное по умолчанию, не распознается во время выполнения Строка к растровому изображению в Котлине Что такое @InlineOnly аннотация? Могу ли я написать функцию расширения Kotlin, которая использует автоспуск Spring bean? Каково место в иерархии типов типов с возможностью NULL? java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: невозможно слить dex