User Tools

Site Tools


zh_cn:tutorial:interface_injection

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

zh_cn:tutorial:interface_injection [2022/03/20 13:01] – created solidblockzh_cn:tutorial:interface_injection [2025/10/09 14:18] (current) solidblock
Line 4: Line 4:
  
 这对库来说尤其有用,你可以给已有的类添加方法,并且可以直接使用而不需要每次都强转或重新实现接口。 这对库来说尤其有用,你可以给已有的类添加方法,并且可以直接使用而不需要每次都强转或重新实现接口。
 +
 +Fabric API 利用了这一技术,例如,''TagBuilder'' 实现 ''FabricTagBuilder'',''BlockEntityType'' 实现 ''FabricBlockEntityType'',这样你就可以在原版类上调用 Fabric API 中的实例方法。
  
 举个例子来更好地解释: 举个例子来更好地解释:
Line 9: Line 11:
  
 <yarncode java [enable_line_numbers="false"]> <yarncode java [enable_line_numbers="false"]>
-Optional<class_3414> getBucketEmptySound()+Optional<class_3414> getBucketEmptySound$myMod()
 </yarncode> </yarncode>
  
Line 18: Line 20:
  
 public interface BucketEmptySoundGetter { public interface BucketEmptySoundGetter {
- // 被注入的接口中的方法必须为 default, + default Optional<class_3414> getBucketEmptySound$myMod() {
- // 否则使用到这些地方的代码不会编译! +
- default Optional<class_3414> getBucketEmptySound() {+
  return Optional.empty();  return Optional.empty();
  }  }
 } }
 </yarncode> </yarncode>
 +
 +:!: 接口中的方法体可能不会被使用,因为会被 mixin 类覆盖,但是,你还是必须指定方法体(也就是说方法必须为 ''default'')。你可以让它返回 null 或者抛出 ''UnsupportedOperationException'',但是//不可以//让它抽象,例如 ''Optional<yarn class_3414> getBucketEmptySound()'',否则编译时就会出错!
 +
 +ℹ️ 强烈建议在方法名称中加入美元符号或下划线和模组名称,作为方法名称的前缀或者后缀,这样是为了避免与其他模组的方法名称冲突。
  
 现在你需要通过实现该接口的 mixin 来将该接口实现到 ''<yarn net.minecraft.class_3609>'' 中。 现在你需要通过实现该接口的 mixin 来将该接口实现到 ''<yarn net.minecraft.class_3609>'' 中。
Line 32: Line 36:
 public class MixinFlowableFluid implements BucketEmptySoundGetter { public class MixinFlowableFluid implements BucketEmptySoundGetter {
  @Override  @Override
- public Optional<class_3414> getBucketEmptySound() {+ public Optional<class_3414> getBucketEmptySound$myMod() {
  // 这是如何获取默认声音的,从 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:
 </yarncode> </yarncode>
  
-最后你需要将库注入到 ''<yarn net.minecraft.class_3609>''。可以将以下片段添加到你的 fabric.mod.json 文件中,以给 ''<yarn net.minecraft.class_3609>'' 类添加一个或多个接口。注意这里所有的类名称都必须使用“内部名称”并使用斜杠而非点。+最后你需要将库注入到 ''<yarn net.minecraft.class_3609>''。可以将以下片段添加到你的 ''fabric.mod.json'' 文件中,以给 ''<yarn net.minecraft.class_3609>'' 类添加一个或多个接口。注意这里所有的类名称都必须使用“内部名称”并使用斜杠而非点。
  
-<code json [enable_line_numbers="false"]>+<code json fabric.mod.json [enable_line_numbers="false"]>
 { {
  "custom": {  "custom": {
Line 54: Line 58:
  
 <yarncode java [enable_line_numbers="false"]> <yarncode java [enable_line_numbers="false"]>
-Optional<class_3414> sound = mytestfluid.getBucketEmptySound();+Optional<class_3414> sound = mytestfluid.getBucketEmptySound$myMod();
 </yarncode> </yarncode>
  
-您还可以在继承了 FlowableFluid 的类中覆盖此方法以实现自定义行为。+您还可以在继承了 ''FlowableFluid'' 的类中覆盖此方法以实现自定义行为。
zh_cn/tutorial/interface_injection.txt · Last modified: 2025/10/09 14:18 by solidblock