同伴对象中的kotlin抽象静态乐趣

我从名为UserViewHolder的官方示例中了解了ViewHolder的用法。

public class UserViewHolder extends RecyclerView.ViewHolder { static UserViewHolder create(LayoutInflater inflater, ViewGroup parent) { UserItemBinding binding = UserItemBinding .inflate(inflater, parent, false); return new UserViewHolder(binding); } private UserItemBinding mBinding; private UserViewHolder(UserItemBinding binding) { super(binding.getRoot()); mBinding = binding; } public void bindTo(User user) { mBinding.setUser(user); mBinding.executePendingBindings(); } } 

我要写许多ViewHolder类,所以我希望我可以写一个抽象类。 在Java中,它看起来像:

 public abstract static class BaseViewHolder { abstract static BaseViewHolder create() abstract void bindTo() } 

我尝试使用Kotlin编写它,但最终我发现它并不像Java那样简单。

 abstract class BaseViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) { abstract fun bindTo(viewModel: BaseViewModel) } 

在Kotlin中,如果我想要一个静态函数,我需要在“伴侣对象”中编写函数。 但它不能是一个“抽象的”。

在Java中,具有抽象类的抽象类是很常见的。

但是我怎样才能把它写在Kotlin呢?

更新:

我写了我自己的SleepViewHolder 。 我要写很多的ViewHolder,如AppleViewHolder,BananaViewHolder等。 所以我想建立一个BaseViewHolder作为一个模式。 我的问题是,在这种情况下,编写模式BaseViewHolder的最好方法是什么? 我应该改变它的结构,还是要公开创建function?

 open class SleepViewHolder private constructor(private val binding: ItemSleepBinding) : RecyclerView.ViewHolder(binding.root) { companion object { @JvmStatic fun create(inflater: LayoutInflater, parent: ViewGroup): SleepViewHolder { val binding: ItemSleepBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_base, parent, false) return SleepViewHolder(binding) } } open fun bindTo(viewmodel: SleepViewModel) { binding.vm = viewmodel binding.executePendingBindings() } 

}

Kotlin ,与Java or C#,类没有静态方法。 在大多数情况下,建议仅使用包级函数。

如果您需要编写一个可以在没有类实例的情况下调用的函数,但需要访问类的内部函数(例如工厂方法),则可以将其作为该类中的对象声明的成员编写。

更具体地说,如果你在类中声明了一个伴侣对象,那么你就可以使用与在Java/C#调用静态方法相同的语法来调用它的成员,只使用类名作为限定符。

这是你如何写一个同伴class

 class MyClass { companion object { } // will be called "Companion" } fun MyClass.Companion.foo() { // ... } 

这是你如何调用foo()函数…

 MyClass.foo()