Cannot get child node in inherited scene extending custom class

Godot Version

4.4

Question

Hello!

I have a scene called TileBase, which extends AnimatableBody3D, and looks like this:

TileBase
|- CollisionShape3D
|- Area3D
|  |- CollsisionShape3D
|- MeshInstance3D

Its script is currently empty, but I will add functionality to it later on, functionality that I want each Tile to have.

# tile_base.gd
class_name TileBase
extends AnimatableBody3D

Then, I have an inherited scene TileMoving:

TileMoving
|- CollisionShape3D
|- Area3D
|  |- CollsisionShape3D
|- MeshInstance3D
|- MovingComponent

With its script:

# tile_moving.gd
@tool
extends TileBase

@export var end_position_offset: Vector3:
    get: return $MovingComponent.end_position_offset
    set(v): $MovingComponent.end_position_offset = v
@export_range(0.0, 1000.0) var travel_time: float:
    get: return $MovingComponent.travel_time
    set(v): $MovingComponent.travel_time = v
@export_range(0.0, 1000.0) var pause_time: float:
    get: return $MovingComponent.pause_time
    set(v): $MovingComponent.pause_time = v

For reference, MovingComponent is an empty scene tree with the following script:

# moving_component.gd
@tool

class_name MovingComponent
extends Node

@export var end_position_offset: Vector3
@export var travel_time: float
@export var pause_time: float
    
func _ready() -> void:
    if Engine.is_editor_hint():
        return

    start_tween()
    
func _process(_delta: float) -> void:
    if Engine.is_editor_hint():
        if owner && EditorInterface.get_selection().get_selected_nodes().has(owner):
            var owner_pos = owner.position
            var end_pos = owner_pos + end_position_offset
            DebugDraw3D.draw_aabb_ab(end_pos, end_pos + Vector3(2.0, 0.5, 2.0))
        return

func start_tween() -> void:
    var tween = get_tree().create_tween().set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
    tween.set_loops().set_parallel(false)
            
    var start_position = owner.position
    var end_position = start_position + end_position_offset
    
    tween.tween_interval(pause_time)
    tween.tween_property(owner, "position", end_position, travel_time)
    tween.tween_interval(pause_time)
    tween.tween_property(owner, "position", start_position, travel_time)

The issue I’m encountering, is that tile_moving.gd generates errors where I’m accessing $MovingComponent. It says Node not found: "MovingComponent" (relative to TileBase). But I don’t understand why it’s searching relative to TileBase, that’s not where the script is attached. Sure TileMoving is extending TileBase, but I’d expect the script attached to node TileMoving to search relative to TileMoving!

What am I doing wrong here? How can I fix this issue?

Thanks!