Pensé que escribiría una clase de Item base que implementa una función de use(Dog dog) . Luego, si un elemento específico quiere aplicar una determinada funcionalidad para un perro, podría anular la función con un tipo de perro más específico. Por ejemplo TennisBall : Item has a use(GoldenRetriever dog) . Sin embargo, después de haber escrito esto, parece que solo se llama a la función principal.
En mi clase de Inventory tengo una referencia al perro basada en la clase Dog . Cuando registro cuál es el tipo de este Dog , obtengo GoldenRetriever . Sin embargo, se llama a la función principal Item.use() en lugar de a la función más concreta TennisBall.use() . La razón de esto es probablemente que Dog es a lo que se envía la instancia, por lo que llamará así (no estoy muy seguro de por qué mi Debug.Log todavía muestra GoldenRetriever entonces).
Intenté especificar algunas interfaces para resolver el problema también, pero parece que el problema persiste. Mi sensación es que esto tiene más que ver con los parámetros en los métodos que con cualquier otra cosa.
public class Inventory : MonoBehaviour { ... private List<Item> items = new List<Item>(); private Dog dog; public int activeItem = 0; ... public void addItem(Item item) { items.Add(item); // This is where the TennisBall item will be added } public void open(Dog dog) { open(); this.dog = dog; } void Update() { if (Input.GetKeyDown(KeyCode.E)) { Debug.Log(dog); // Output: Golden Retriever (GoldenRetriever) items[activeItem].use(dog); } } }Articulo:
public class Item : MonoBehaviour { public void use(Dog dog) { Debug.Log(dog); // Still Golden Retriever (GoldenRetriever) throw new NotImplementedException(); } }Pelota de tenis:
public class TennisBall : Item { public void use(GoldenRetriever dog) { Debug.Log("Doing something specifically for a Golden Retriever!"); // This never gets called } }Puede comenzar anulando la función de use y usando algunas pruebas de tipo en la anulación:
public class Item : MonoBehaviour { public vitual void use(Dog dog) { Debug.Log(dog); // Still Golden Retriever (GoldenRetriever) throw new NotImplementedException(); } } public class TennisBall : Item { public override void use(Dog dog) { var goldenRetriever = dog as GoldenRetriever; // check if dog is of type GoldenRetriever if(goldenRetriever != null) { Debug.Log("Doing something specifically for a Golden Retriever!"); // This never gets called } // your other logic.... } }