使用接口通过方法

问题描述 投票:0回答:1

我有2+个来自不同继承树的对象,但我希望它们共享一组通用代码IMoveable

IMoveable界面看起来不错,我对使用它的位置感到满意:

public interface IMoveable
{
  /// <summary>
  /// The speed the object travells between start and end
  /// </summary>
  int Speed { get; set; }

  /// <summary>
  /// The current velocity of the object
  /// </summary>
  Vector2 Velocity { get; set; }

  /// <summary>
  /// How far the object has travelled
  /// </summary>
  int DistanceTravelled { get; set; }

  /// <summary>
  /// The map the object is traversing
  /// </summary>
  Map Map { get; set; }

  /// <summary>
  /// Where the object was when they started moving
  /// </summary>
  Rectangle StartRectangle { get; set; }

  /// <summary>
  /// Where the object is right now
  /// </summary>
  Rectangle CurrentRectangle { get; }

  /// <summary>
  /// Where the object will be after moving
  /// </summary>
  Rectangle EndRectangle { get; set; }

  /// <summary>
  /// What will happen if the object walks to the "EndRectangle"
  /// </summary>
  Map.CollisionResults CollisionResult { get; set; }

  /// <summary>
  /// What happens if the object triggers a battle
  /// </summary>
  Action OnBattle { get; set; }

  /// <summary>
  /// How the object determines their movement
  /// </summary>
  Action SetMovement { get; set; }
}

通过该接口,我有一种方法:

 private static void Move(IMoveable moveableOjb)
  {
    moveableOjb.Speed = 4;

    if (moveableOjb.DistanceTravelled > 0)
    {
      moveableOjb.DistanceTravelled += moveableOjb.Speed;

      if (moveableOjb.DistanceTravelled > Map.TileWidth)
      {
        moveableOjb.DistanceTravelled = 0;
        moveableOjb.Velocity = new Vector2();
      }
      else
      {
        return;
      }
    }

    moveableOjb.SetMovement();

    if (moveableOjb.Velocity != Vector2.Zero)
    {
      moveableOjb.StartRectangle = moveableOjb.CurrentRectangle;
      moveableOjb.EndRectangle = new Rectangle(
        moveableOjb.CurrentRectangle.X + ((int)moveableOjb.Velocity.X * 10),
        moveableOjb.CurrentRectangle.Y + ((int)moveableOjb.Velocity.Y * 10),
        moveableOjb.CurrentRectangle.Width,
        moveableOjb.CurrentRectangle.Height);

      moveableOjb.CollisionResult = moveableOjb.Map.GetValue(moveableOjb.EndRectangle);

      switch (moveableOjb.CollisionResult)
      {
        case Map.CollisionResults.None:
          break;
        case Map.CollisionResults.Colliding:
          moveableOjb.Velocity = new Vector2();
          break;
        case Map.CollisionResults.Battle:
          moveableOjb.OnBattle();
          moveableOjb.Velocity = new Vector2();
          break;
        case Map.CollisionResults.OffRight:
        case Map.CollisionResults.OffLeft:
        case Map.CollisionResults.OffTop:
        case Map.CollisionResults.OffBottom:
          moveableOjb.Speed = 0;
          break;
        default:
          break;
      }
    }

    if (moveableOjb.Velocity != Vector2.Zero)
      moveableOjb.DistanceTravelled += moveableOjb.Speed;
  }

我面临的问题是这段代码很奇怪。我有一个静态的Move方法,我不知道将它放在哪里,而且我觉得我已经完全以错误的方式解决了。

我的另一种选择是重写我的类,因此它们位于同一棵树中,而不是来自不同的继承。我可以这样做,但是要花一些时间进行重组。

我想我的主要问题是-我是要以错误的方式进行操作,还是要接近无法完全弄清的编码实践?]

编辑:

我们已经得知,您可以使用C#8的默认接口方法。我认为这可能正是我所需要的!

我有2个以上的对象来自不同的继承树,但我希望它们共享一组共同的代码IMoveable。 IMoveable界面看起来不错,我对自己拥有的位置感到满意...

c# interface xna monogame
1个回答
0
投票

代替静态方法,将其定义为实现IMoveable且没有参数的类的成员。这样,实例this将移动。您可以通过从该实例调用它来进行移动,这在语义上更有意义:

IMoveable moveableObj = //constructor here...
moveableObj.Move();
© www.soinside.com 2019 - 2024. All rights reserved.