zh_cn:tutorial:interface_injection
Differences
This shows you the differences between two versions of the page.
zh_cn:tutorial:interface_injection [2022/03/20 13:01] – created solidblock | zh_cn:tutorial:interface_injection [2025/10/09 14:18] (current) – solidblock | ||
---|---|---|---|
Line 4: | Line 4: | ||
这对库来说尤其有用,你可以给已有的类添加方法,并且可以直接使用而不需要每次都强转或重新实现接口。 | 这对库来说尤其有用,你可以给已有的类添加方法,并且可以直接使用而不需要每次都强转或重新实现接口。 | ||
+ | |||
+ | Fabric API 利用了这一技术,例如,'' | ||
举个例子来更好地解释: | 举个例子来更好地解释: | ||
Line 9: | Line 11: | ||
< | < | ||
- | Optional< | + | Optional< |
</ | </ | ||
Line 18: | Line 20: | ||
public interface BucketEmptySoundGetter { | public interface BucketEmptySoundGetter { | ||
- | // 被注入的接口中的方法必须为 default, | + | default Optional< |
- | // 否则使用到这些地方的代码不会编译! | + | |
- | default Optional< | + | |
return Optional.empty(); | return Optional.empty(); | ||
} | } | ||
} | } | ||
</ | </ | ||
+ | |||
+ | :!: 接口中的方法体可能不会被使用,因为会被 mixin 类覆盖,但是,你还是必须指定方法体(也就是说方法必须为 '' | ||
+ | |||
+ | ℹ️ 强烈建议在方法名称中加入美元符号或下划线和模组名称,作为方法名称的前缀或者后缀,这样是为了避免与其他模组的方法名称冲突。 | ||
现在你需要通过实现该接口的 mixin 来将该接口实现到 ''< | 现在你需要通过实现该接口的 mixin 来将该接口实现到 ''< | ||
Line 32: | Line 36: | ||
public class MixinFlowableFluid implements BucketEmptySoundGetter { | public class MixinFlowableFluid implements BucketEmptySoundGetter { | ||
@Override | @Override | ||
- | public Optional< | + | public Optional< |
// 这是如何获取默认声音的,从 BucketItem 类中复制。 | // 这是如何获取默认声音的,从 BucketItem 类中复制。 | ||
return Optional.of(((FlowableFluid) (Object) this).isIn(FluidTags.LAVA) ? SoundEvents.ITEM_BUCKET_EMPTY_LAVA : SoundEvents.ITEM_BUCKET_EMPTY); | return Optional.of(((FlowableFluid) (Object) this).isIn(FluidTags.LAVA) ? SoundEvents.ITEM_BUCKET_EMPTY_LAVA : SoundEvents.ITEM_BUCKET_EMPTY); | ||
Line 39: | Line 43: | ||
</ | </ | ||
- | 最后你需要将库注入到 ''< | + | 最后你需要将库注入到 ''< |
- | <code json [enable_line_numbers=" | + | < |
{ | { | ||
" | " | ||
Line 54: | Line 58: | ||
< | < | ||
- | Optional< | + | Optional< |
</ | </ | ||
- | 您还可以在继承了 FlowableFluid 的类中覆盖此方法以实现自定义行为。 | + | 您还可以在继承了 |
zh_cn/tutorial/interface_injection.txt · Last modified: 2025/10/09 14:18 by solidblock