如何 abstract/remove 以下 class 示例中的冗余方法
How to abstract/remove redundent methods in the following class sample
我正在尝试删除我的 Enemy0
、Enemy1
、... 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)
等等等等
我正在尝试删除我的 Enemy0
、Enemy1
、... 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
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)
等等等等