gpt4 book ai didi

android - Kotlin:如何摆脱功能过载样板?

转载 作者:行者123 更新时间:2023-12-02 13:10:32 24 4
gpt4 key购买 nike

我正在Kotlin中使用重载函数。
在此示意性示例中,假设一个函数的唯一区别是传递给该函数的view的类型。一个使用TextView,另一个使用Button,所以我有2个不同的功能。

fun workWithViews(v:TextView,...){
// code
}
fun workWithViews(v:Button,...){
// same code!
}
在这种情况下,我使用的属性是相同的( isAllCapsgravity等)。问题是我必须将相同的代码放置两次,即整个代码完全相同。
发生这种情况是因为 isAllCaps(就像许多其他属性一样)不是 view的常规属性,而是某些类型的 View
因此它不起作用,因为显然编译器看到的是函数参数,而不是实际参数。
我还可以使用 view类型参数来实现功能,并使用可能的类型使用大 when来实现功能:
fun workWithTextView(v:View,...){
when{
(v is TextView) -> {
// code
}
(v is Button) {
// same code
}
} // when
}
这两个解决方案很糟糕,并且会生成重复的代码或样板。
在每次访问某个字段之前,我还可以执行 when,这会使情况变得更糟。现在想象一下,如果有5个相似类型而不是2个,并且有许多共同点。
我阅读了一些在Kotlin中创建 union types的建议。这会很棒!
例如:
fun workWithViews(v:(TextView, Button),...){
// just one code repetition....
}
要么
 union textBut = TextView , Button
fun workWithViews(v:textBut ,...){
// just one code repetition....
}
在那种情况下,如果我使用某种特定于该类型的东西,则只需要测试该类型( if (v is typeX))即可。
有什么最好的解决方案吗?

最佳答案

ButtonTextView的子类,因此您可以使函数签名采用TextView并将Button特定的内容放入if块中。

fun workWithTextView(textView: TextView) {
// Do stuff common to TextViews and Buttons.

if (textView is Button) {
// Do extra stuff only for Buttons.
}
}

关于android - Kotlin:如何摆脱功能过载样板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64177619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com