Класс Instance или Inherited Class для игры?Лучшая практика - PullRequest
0 голосов
/ 13 февраля 2019

Итак, я создаю небольшую игровую среду для усиления абстрактных классов и интерфейсов.Я строил классы для некоторой механики, и я не уверен, как обращаться с финальными частями.

Вот структура классов (с некоторыми удаленными различными методами):

public abstract class Ability
{
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string Type { get; set; }
    public virtual string Stat { get; set; }
    public virtual float Scale { get; set; }
    public virtual float MPCost { get; set; }
    public virtual float SPCost { get; set; }
}

public class Attack : Ability
{
    public float BaseDmg { get; set; }
    public bool isUnblockable { get; set; }

    public float GetDmg(int stat)
    {
        return BaseDmg * (1 + stat * Scale);
    }
}

Теперь для фактических атак, которые я хочу создать, должен ли я создать экземпляр, как был?

public static class AllAttacks
{
    //Physical Attacks
    public static Attack slash = new Attack();

    //Magical Attacks
    public static Attack push = new Attack();

    public static void Generate()
    {
        //Physical Attacks
        slash.Name = "Slash";
        slash.Description = "A simple but effective strike.";
        slash.Type = "physical";
        slash.Stat = "str";
        slash.Scale = 0.1F;
        slash.MPCost = 0;
        slash.SPCost = 1;
        slash.BaseDmg = 5;
        slash.isUnblockable = false;

        //Magical Attacks
        push.Name = "Push";
        push.Description = "A powerful telekinetic strike.";
        push.Type = "magic";
        push.Stat = "int";
        push.Scale = 0.1F;
        push.MPCost = 1;
        push.SPCost = 0;
        push.BaseDmg = 5F;
        push.isUnblockable = false;
    }

Или я должен фактически создать новый унаследованный класс для каждого уникального элемента, а затем создать его экземпляр в классе Fight?И если я это сделаю, должны ли они быть статическими или нестатичными?

public class Slash : Attack { //Code Here }

Может кто-нибудь указать мне на лучшие практики или какой самый эффективный метод будет?

1 Ответ

0 голосов
/ 13 февраля 2019

Как правило, есть две основные причины для определения нового класса: новое поведение и / или новый контракт, то есть измененная реализация по первой причине или добавление новых открытых членов для второй.Теперь, рассматривая ваш пример, я не вижу измененных контрактов или поведения для различных типов атак (только измененное состояние), поэтому я не вижу причины для определения новых классов для них.Однако с точки зрения читабельности метод Generate не оптимален - я бы создал отдельные методы для разных типов атак, которые бы четко обозначали, какой тип атаки они создают.

Что касается аспектов реализации, еслиВы не собираетесь мутировать свои экземпляры атаки, чем создавать их в одном месте - это нормально, в противном случае вам нужно контролировать жизненный цикл каждого экземпляра атаки на уровне, где используется этот экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...