From 4a5f21a11bb8b52156a8c8aa83a5b8d5e5bf0a99 Mon Sep 17 00:00:00 2001 From: Alice Cecile Date: Thu, 28 Nov 2024 16:09:26 -0500 Subject: [PATCH] Clarify inheritance behavior of required components (#16546) Co-authored by: @BenjaminBrienen # Objective Fixes #16494. Closes #16539, which this replaces. Suggestions alone weren't enough, so now we have a new PR! --------- Co-authored-by: Joona Aalto --- crates/bevy_ecs/src/component.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_ecs/src/component.rs b/crates/bevy_ecs/src/component.rs index b915f8b5cad09..cdf93adb6d060 100644 --- a/crates/bevy_ecs/src/component.rs +++ b/crates/bevy_ecs/src/component.rs @@ -226,9 +226,9 @@ use derive_more::derive::{Display, Error}; /// assert_eq!(2, world.entity(id).get::().unwrap().0); /// ``` /// -/// In general, this shouldn't happen often, but when it does the algorithm is simple and predictable: -/// 1. Use all of the constructors (including default constructors) directly defined in the spawned component's require list -/// 2. In the order the requires are defined in `#[require()]`, recursively visit the require list of each of the components in the list (this is a Depth First Search). When a constructor is found, it will only be used if one has not already been found. +/// In general, this shouldn't happen often, but when it does the algorithm for choosing the constructor from the tree is simple and predictable: +/// 1. A constructor from a direct `#[require()]`, if one exists, is selected with priority. +/// 2. Otherwise, perform a Depth First Search on the tree of requirements and select the first one found. /// /// From a user perspective, just think about this as the following: /// 1. Specifying a required component constructor for Foo directly on a spawned component Bar will result in that constructor being used (and overriding existing constructors lower in the inheritance tree). This is the classic "inheritance override" behavior people expect.