Как добавить функциональность в существующие классы? - PullRequest
0 голосов
/ 08 октября 2019

В настоящее время я занимаюсь разработкой библиотеки Android. По сути, идея состоит в том, чтобы добавить некоторые функциональные возможности в любой виджет Android, который есть. Библиотека используется для создания составных представлений, и пользователь должен иметь возможность преобразовывать каждый существующий виджет / представление Android в составное представление с некоторыми дополнительными функциями, которые я хочу динамически добавить.

Каждое из этих представлений должно быть пригодно для использования внутри XML-файлов, что означает, что я не могу слишком сильно изменять конструктор.

Другое требование заключается в том, что мне нужна опция для предоставления некоторых классов пользователюза взгляды. Я имею в виду, что созданное составное представление будет иметь открытую переменную с именем viewStore. Тип вашего viewStore может быть либо пользовательской реализацией интерфейса ViewStore (предпочтительный способ, но я вполне уверен, что для этого потребуется генерация кода, как описано ниже), либо будет предоставлен с помощью обобщений.

В конце концов, составнойпредставление будет иметь такую ​​структуру папок:

  • Папка MyView
    • MyView расширяет CoolViewWithViewStore расширяет AndroidWidgetChoosenByUser
    • MyViewStore реализует ViewStore <- используется в CoolViewWithViewStore </li>

Один из вариантов - расширить каждый виджет. Я не думаю, что мне нужно объяснять, почему это плохая идея. Кроме того, пользователь не может предоставить дополнительные классы, которые необходимы.

Еще одна мысль, о которой я подумал, - аннотация с генерацией кода. Проблема, с которой я столкнулся, заключалась в том, что пользователю нужен доступ к переменным CoolViewWithViewStore внутри MyView, что было бы невозможно, поскольку CoolViewWithViewStore будет сгенерирован во время компиляции, и, кроме того, пользователь может случайно использовать свой класс внутри XML вместо нашего сгенерированного.

Хотелось бы услышать, есть ли у кого-нибудь лучшее представление о том, как с этим справиться, или есть даже чистое решение для достижения такой архитектуры. Если у кого-то есть лучшее представление о том, как структурировать мою библиотеку, я бы тоже хотел это услышать.

1 Ответ

0 голосов
/ 08 октября 2019

Используя функцию расширения Kotlin , вы можете расширить класс с новыми функциями без необходимости наследования от класса.

...