如何 abstract/remove 以下 class 示例中的冗余方法

How to abstract/remove redundent methods in the following class sample

我正在尝试删除我的 Enemy0Enemy1、... class 中继承自我的 abstract Enemy [=42] 的冗余=].这就是全部 Monogame/XNA.

我的摘要 class 看起来像这样:

public abstract class Enemy
{
    public abstract Vector2 Position { get; }

    public Enemy() {}

    public abstract void Update(GameTime gameTime);

    public abstract void Draw(SpriteBatch spriteBatch);

    public abstract Part getLeftPart();

    public abstract Part getRightPart();

    public abstract Part getLeftLeftPart(); //This method only used in Boss0 classes

    public abstract Part getRightRightPart(); //This method only used in Boss0 classes
}

虽然我的 Enemy# classes 在实现上有所不同,但有些方法正是 same/redundant 并占用空间(但具有与 class 相关的参数,例如私有变量 _leftPartPos).

问题发生在我有 20 个左右 Enemy# classes 并且我决定向 Part 对象添加一个额外参数(在 getLeftPart()- 我还必须修改继承 Enemy

的那些 classes 中的 20 个
public class Enemy0 : Enemy
{
    private Texture2D _partTexture;
    private Vector2 _leftpartPos;
    private Vector2 _rightPartPos;

    public override Vector2 Position
    {
        get { return _position; } // Reason for this get is to access inner variables
    }                             // like _position.X = 10
    private Vector2 _position;

    public Enemy() {}

    public abstract void Update(GameTime gameTime)
    {
        // Some varying functionality per inheriting class
    }

    public abstract void Draw(SpriteBatch spriteBatch)
    {
        // Some varying functionality per inheriting class
    }

    public override Part getLeftPart() // This always returns the same object (with
    {                                  // different params)
        return new Part(
            _partTexture,
            _leftPartPos,
            SpriteEffects.FlipHorizontally);
    }

    public abstract Part getRightPart()
    {
        return new Part(
            _partTexture,
            _rightPartPos,
            SpriteEffects.None);
    }

    public override Part getLeftLeftPart()
    {
        return null; // This only returns an instance in Boss0, Boss1, etc
    }

    public override Part getRightRightPart()
    {
        return null;
    }
}

我有这个抽象 class 的原因是我可以初始化一个 List<Enemy> 对象并访问它的各种方法,而不必将每个 class 转换为 Enemy0 , Enemy1, ...

有什么方法可以将 getLeftPart()getRightPart()、...的功能放入我的摘要 class 中?有没有更好的方法来解决所有这些问题?

将它们声明为 virtual 而不是 abstract。这样,您可以在根 class 中提供基本实现,并在子 classes 中覆盖它(如果它们需要不同的功能)。

public abstract class RootClass
{
    public virtual void DoSomething()
    {
        Console.WriteLine("I'm doing something in the root class");
    }
}

public class ChildClass1 : RootClass
{
    public void SomethingElse()
    {
        DoSomething(); //Prints out "I'm doing something in the root class"
    }
}

public class ChildClass2 : RootClass
{
    public void SomethingElse()
    {
        DoSomething(); //Prints out "I'm doing something in ChildClass2
    }

    public override void DoSomething()
    {
        Console.WriteLine("I'm doing something in ChildClass2");
    }
}

如果必须采用可变数量的参数,请使用 params 属性声明方法,例如:

public virtual void DoSomething(params object[] args)

这会导致装箱,因此请注意性能影响。如果您需要做更具体的事情,请尝试:

public virtual void DoSomething<T>(params T[] args)

但这里唯一的区别是所有参数必须是同一类型,或者可以转换为该类型。如果您只需要某种类型的一个参数,请使用:

public virtual void DoSomething<T>(T arg)

或者你可以有两种(或更多类型)

public virtual void DoSomething<T1, T2>(T1 arg1, T2 arg2)

等等等等