2015-07-12 3 views
0

СитуацииПравильно доступ к параметрам от «: База» конструктора

Я делаю небольшую игру на основе текста с использованием некоторых методов объектно-ориентированного программирования, я узнал в этом учебном году, поэтому я делаю это в основном улучшить ООП, которые я сейчас знаю, и, надеюсь, улучшить некоторые из моих практик при помощи опытных пользователей.

Так, в неспециалист условия, я в настоящее время имею класс «ОРК», который простирающийся «враг» и «враг» расширяет «Entity»

public class Ork : Enemy 

public class Enemy : Entity 

У меня есть класс «Enemy», потому что я намерен сделать много уникальных типов объектов противника, а не просто «Орк», с этой текущей настройкой я мог бы сделать «Эльф» или «Человек» таким же образом. (и в будущем гораздо проще добавлять новые типы). У Enemy есть собственный конструктор.

public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold, string Name, string Type, 
     string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man) 
    { 
     //make a new entity instance. 
     entity = new Entity(); 

     //Set all the local variables to the passed in parameters. 

     setEntity(Name, Type, Spawnzone, _Class, Defaultlevel, Maxlevel, trait, str, agi, dex, hel, man); 

     droplist = Droplist; 
     defaultgold = Defaultgold; 
     weaknesses = Weaknesses; 
     resistances = Resistances; 
     taunts = Taunts; 
     aggro = Aggro; 
     critchance = Critchance; 
     threshold = Threshold; 

} 

Как вы можете видеть, я установить входящий параметр в локальной переменной, и я использую setEntity, который делает некоторые из этой работы для меня. У меня также есть класс «Entity», и причина этого заключается не в том, что «Stats» является врагом, поэтому у меня есть «Entity» как посредник.

Проблема

Проблема находится в конце этой линии классов, Орков класса.

В других программах, например, моя программа Hillracing, мой конструктор для подобного класса будет выглядеть следующим образом:

public JuniorMember(string stringfirstname, string stringlastname, string stringmiddlename, string stringtitle, string strst, string strtwn, string strpc, string strEmail, int intMobile, int intHome, 
      string shrnumber, string memtype, string username, string password, int noracesrun, float perraceswon, string mempic, string memclub, string gender, int memexp, int yearofbirth, int monthofbirth, int dayofbirth, string nextofkin, string docName, string docTel, string healthIssues, string parentalConsent) 
      : base(stringfirstname, stringlastname, stringmiddlename, stringtitle, strst, strtwn, strpc, strEmail, intMobile, intHome, shrnumber, memtype, username, password, noracesrun, perraceswon, mempic, memclub, 
      gender, memexp, yearofbirth, monthofbirth, dayofbirth) 
     { 

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

Пример, который я дал от Hillracing, работает безупречно, но мне просто интересно, если это лучший способ сделать это, поскольку список параметров выглядит беспорядочным, и мне кажется, что я создаю вещи, которые были ранее создано. Я имею в виду, что 90% информации, необходимой мне для создания объекта Ork, происходит из других источников.

Редактировать

Благодаря замечаний, я удалил новый Entity я сделал в моем вражеского классе, теперь у меня есть следующий класс Enemy:

public class Enemy : Entity 
{ 

    private string[] droplist; 

    private int defaultgold; 

    private string weaknesses; 

    private string resistances; 

    private string[] taunts; 

    private string aggro; 

    private string critchance; 

    private string threshold; 


    public string[] Droplist { get { return droplist; } set { droplist = value; } } 
    public int Defaultgold { get { return defaultgold; } set { defaultgold = value; } } 
    public string Weaknesses { get { return weaknesses; } set { weaknesses = value; } } 
    public string Resistances { get { return resistances; } set { resistances = value; } } 
    public string[] Taunts { get { return taunts; } set { taunts = value; } } 
    public string Aggro { get { return aggro; } set { aggro = value; } } 
    public string Critchance { get { return critchance; } set { critchance = value; } } 
    public string Threshold { get { return threshold; } set { threshold = value; } } 




    public void setEntity(string EnName, string EnType, string EnSpawnzone, string En_Class, int EnDefaultlevel, int EnMaxlevel, string Entrait, int Enstr, int Enagi, int Endex, int Enhel, int Enman) 
    { 


     setStats(Enstr, Enagi, Endex, Enhel, Enman); 

     Name = EnName; 
     Type = EnType; 
     Spawnzone = EnSpawnzone; 
     _Class = En_Class; 
     Defaultlevel = EnDefaultlevel; 
     Maxlevel = EnMaxlevel; 
     trait = Entrait; 

    } 

    public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold) 

     :base(Name,Type,Spawnzone,_Class,Defaultlevel,Maxlevel,trait,str,agi,dex,hel,man) 
    { 

     //Set all the local variables to the passed in parameters. 

     setEntity(Name, Type, Spawnzone, _Class, Defaultlevel, Maxlevel, trait, str, agi, dex, hel, man); 

     droplist = Droplist; 
     defaultgold = Defaultgold; 
     weaknesses = Weaknesses; 
     resistances = Resistances; 
     taunts = Taunts; 
     aggro = Aggro; 
     critchance = Critchance; 
     threshold = Threshold; 

} 

Мой вопрос здесь, я не знаю, как получить информацию от Entity в этот момент, я не могу получить доступ к переменным Name,Type,Spawnzone,etc,etc, потому что они ожидают ссылку на объект.

+0

вы можете сделать метод без параметров, и эти параметры будут преобразуется в свойства внутри вашего класса, и если эти свойства являются общими для ваших объектов, вы можете создать интерфейс для этого – Monah

+0

'Enemy', расширяющий' Entity', вы не должны иметь переменную сущности в своем классе «Enemy», поскольку она уже является самой сущностью. –

+0

Проверьте редактирование, я удалил экземпляр объекта из класса врага. – Method

ответ

0

Entity должен быть базовым классом, который Enemy расширяет (с дополнительной статистикой, которую не все сущности имеют). От конструктора Enemy вы должны вызвать родительский конструктор Entity. Это имеет смысл, потому что Enemy "является (n)" Entity.

Принимая во внимание, что в настоящее время ваша установка такова, что Enemy «имеет (n)» Entity, что не имеет смысла.


Редактировать

У вас есть это уже:

public class Ork : Enemy 

Я говорю, вы также должны иметь это:

public class Enemy : Entity 

И C# Я думаю, что класс конструкторы базового класса автоматически, поэтому вам не нужно ничего делать. Просто сделайте все общее для всех Entity s в конструкторе Entity, Enemy s в Enemy и т. Д.

+0

Враг расширяет Entity. 'public class Enemy: Entity' – Method

+1

Вы уверены? В настоящее время кажется, что вы создаете новый экземпляр 'Entity' в конструкторе' Enemy'. –

+0

Я предполагаю, что это неправильно? – Method

0

Примечание: Я вижу, что вы только что отредактировали, чтобы уточнить, что ваш класс Enemy расширяет Entity. Тогда я не понимаю, почему вы создаете класс Entity внутри конструктора Enemy. Какова логическая связь между Entity и Enemy? Есть Enemy a тип Entity? Или у Enemy есть Entity?

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

public class Entity { 
    // other code 

    public Entity(string Type, string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man) { 
     // move setEntity code here. 
    } 

    // other code 
} 

public class Enemy { 

    // other code 

    public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold, string Name, Entity entity) { 
      this.entity = entity; 

      droplist = Droplist; 
      defaultgold = Defaultgold; 
      weaknesses = Weaknesses; 
      resistances = Resistances; 
      taunts = Taunts; 
      aggro = Aggro; 
      critchance = Critchance; 
      threshold = Threshold; 
    } 

    // other code 
} 
+0

'Enemy' - это тип' Entity'. так же, как 'Player' или' Item' может быть типом 'Entity'. Логическая аргументация для этого - это класс 'Entity', содержащий элементы, которые будут использоваться в будущем,' '' '' '' 'Enemy'''''''''''''. как статистика, все имеет статистику. Извините за путаницу. – Method

0

Я предполагаю, что ваш Enemy класс, содержащий экземпляр Entity. Это неправильная практика в вашем случае. И если ваш класс Enemy расширен на Entity, вы можете использовать его конструктор для установки общих значений родительскому классу. Так же, как вы сделали это в программе HillRacing.

(Убедитесь, что ваш Enemy класс не имеет члена Entity типа. Если это основание Enemy)

public class Entity 
{ 
    public string Type; 
    public string Spawnzone; 
    public string _Class; 
    public string Defaultlevel; 
    public string Maxlevel; 
    public string Trait; 
    public string str; 
    public string agi; 
    public string dex; 
    public string hel; 
    public string man; 

    public Entity(string Type, string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man) 
    { 
     this.Type = Type; 
     this.Spawnzone = Spawnzone; 
     this._Class = _Class; 
     this.Defaultlevel = Defaultlevel; 
     this.Maxlevel = Maxlevel; 
     this.Trait = trait; 
     this.str = str; 
     this.agi = agi; 
     this.dex = dex; 
     this.hel = hel; 
     this.man = man; 
    } 

} 

public class Enemy 
{ 
    public string[] droplist;; 
    public int defaultgold; 
    public string weaknesses; 
    public string resistances; 
    public string[] taunts; 
    public string aggro; 
    public string critchance; 
    public string threshold; 


    public Enemy(string[] Droplist, int Defaultgold, string Weaknesses, string Resistances, string[] Taunts, string Aggro, string Critchance, string Threshold, string Name, string Type, string Spawnzone, string _Class, int Defaultlevel, int Maxlevel, string trait, int str, int agi, int dex, int hel, int man) 
    : base(Type, Spawnzone, _Class, Defaultlevel, Maxlevel, trait, str, agi, dex, hel, man) 
    { 

     droplist = Droplist; 
     defaultgold = Defaultgold; 
     weaknesses = Weaknesses; 
     resistances = Resistances; 
     taunts = Taunts; 
     aggro = Aggro; 
     critchance = Critchance; 
     threshold = Threshold; 
    } 

}

+0

Не могли бы вы привести пример? – Method

Смежные вопросы