Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

170
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda