【问题标题】:Problem: When a method is called, the method of the parent is called, not the inheritor C#问题:调用方法时,调用的是父类的方法,而不是继承者C#
【发布时间】:2022-01-11 19:34:42
【问题描述】:

请帮帮我,我有实体类,其中碰撞器功能。

class Program
{
    static void Main(string[] args)
    {
        Player player = new Player();
        Enemy enemy = new Enemy();
        
        enemy.Collide(enemy, player);
    }
}
public abstract class Entity
{
    public virtual void Visit(Enemy enemy) { }
    public virtual void Visit(Player enemy) { }
    public virtual void Visit(Entity enemy) { }
    
    public virtual void Collide(Entity ent1, Entity ent2)
    {
        ent2.Visit(ent1);
    }
}
public class Enemy : Entity
{
    public override void Visit(Enemy enemy) { }
    public override void Visit(Player enemy) { }
}
public class Player : Entity
{
    public override void Visit(Enemy enemy) { }
    public override void Visit(Player enemy) { }
}

例如,我有 2 个实体 Player:Entity 和 Enemy:Entity;

在Collide方法中调用Visit方法时,ent1为Player,ent2为Enemy,必须调用子类Enemy::Visit(玩家玩家)的方法,但Entity::Visit(Entity实体)方法被调用。

同时在输出ent1.GetType()的时候会写自己是Player,ent2.GetType()是Enemy。为什么编译器会这样做以及如何解决它?

如果我在 Player 中手动施放 ent1,那么一切正常,但我需要多功能性,因为我的游戏中有更多对象。

【问题讨论】:

标签: c# oop


【解决方案1】:

假设我是 Collide 函数,我有一个 Entity 对象,我怎么知道它是 Player 还是 Enemy?等等,有一个Visit(Entity entity) 对吗?就这样,我就叫这个吧。

编译器构建游戏时会发生这种情况。

你可以在Entity中重写Visit(Entity entity),检查你的对象的实际数据类型,调用正确的,然后你就实现你真正关心的,就像你在Enemy中所做的那样。

或者(我认为最好是)删除除Visit(Entity entity)之外的其他功能,检查Enemy覆盖中的类型,然后做你想做的事。

【讨论】:

  • 嗨,我知道在访问(实体实体)中,您可以制作一个处理程序(例如开关)并转换为所需的类型,然后调用所需的访问,但问题是我使用访问者模式和访问(实体实体)我将不得不无休止地添加新的对象游戏,在我看来这是不对的。
  • 您错过了访问者模式的访问者部分。访问者模式的目的是将行为与数据分离,因此它创建了一个“访问者”来定义如何读取数据以及如何操作它。所以你需要一个访问者——可能叫做EntitiyVisitor——来包含你的Entity中的方法并完成这项工作。您可以搜索模式并阅读示例。抱歉回复晚了。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2020-01-15
相关资源
最近更新 更多