Я пытаюсь удалить избыточность, которую у меня есть в моих Enemy0
, Enemy1
, ... классах, которые наследуются от моего класса abstract Enemy
. Это все Monogame/XNA.Как абстрагироваться или удалять избыточные методы в следующем примере класса
Моего абстрактный класс выглядит так:
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#
классов различаются по реализации, некоторые методы точно так же/избыточными и занимают комнату (но есть параметры, относящиеся к этому классу, например, частным переменная _leftPartPos
).
Проблема возникает, когда у меня есть 20 или около Enemy#
классов, и я решил добавить дополнительный параметр в Part
объекта (который используется в getLeftPart()
- я бы также изменить 20 из тех классов, которые наследуют 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;
}
}
причина у меня есть это абстрактный класс, так что я могу инициализировать List<Enemy>
объект и получить доступ к его разнообразным методам без необходимости преобразуйте каждый класс как Enemy0
, Enemy1
...
Есть ли способ, который я могу использовать в функциональности getLeftPart()
, getRightPart()
, ... в моем абстрактном классе? Есть ли лучший подход для всего этого?
** TIP **: Подумайте о переименовании 'Enemy0' и' Enemy1', чтобы они были понятны. _ «20 или около того, врагов # классов» особенно плохо. Откуда вы знаете, что каждый делает? – MickyD
Спасибо за подсказку, это пригодится! - В настоящее время я просто описываю каждый класс в '', дополнительно включающий' 'фразы в конструкторе' ' –