Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

169
Vistas
La función de llamada basada en el tipo de instancia no funciona como esperaba

Problema


Actualmente estoy tratando de escribir un sistema de inventario. El inventario contiene varios elementos. La funcionalidad de cada artículo cambiará según el perro en el que se use. La mayoría de las veces esto significa que no hará nada, pero perros específicos pueden usar elementos específicos.

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.

Pregunta


¿Cómo puedo definir funciones para mis clases derivadas para que se llamen según el tipo de instancia proporcionada? ¿Tengo que *convertir* mi instancia en un tipo específico? Encuentro esto poco intuitivo ya que C# ya parece saber cuál es el tipo de instancia.

Código


Inventario:
 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 } }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.... } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda