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.1647781281.txt.gz · Last modified: 2022/03/20 13:01 by solidblock