2016-12-19 14 views
0

, что у меня есть:Вызов конструктора производного класса от базового класса -> или как сделать правильный Бестиарий

namespace Heroes.Classes 
{ 
class Enemy 
{ 
    private int HP; 
    private int Attack; 
    private int Defense; 

    public string Name; 

    Dice dice = new Dice(); 

    public enum Bestiary 
    { 
     Beasts, 
     Undeads 
    } 

    public enum Beast 
    { 
     Wolf, 
     Bear, 
     Boar 
    } 

    public enum Undead 
    { 
     Skeleton, 
     Ghost, 
     Ghoul 
    } 

    public Enemy() 
    { 
    // here I want to call random CLASS which is derived from this 
    // base class -> that means I want here to create object 
    // Beasts() if Beasts is selected from enum Bestiary 
    } 

    public void EnemySwitch(Bestiary bestiary) 
    { 

     switch (bestiary) 
     { 
      case Bestiary.Beasts: 
       // here I want to call constructor without any parameter -> which means a call random Beast/Method from class Beasts 
       break; 
      case Bestiary.Undeads: 
       // here I want to call constructor without any parameter -> which means a call random Undead/Method from class Undeads 
       break; 
     } 
    } 


    public static T RandomEnumValue<T>() 
    { 
     var v = Enum.GetValues(typeof(T)); 
     return (T)v.GetValue(new Random().Next(v.Length)); 
    } 

    public class Beasts : Enemy 
    { 
     public Beasts() 
     { 
      Beast choice = RandomEnumValue<Beast>(); 
      EnemySwitch(choice); 
     } 

     public Beasts(Beast beast) 
     { 
      EnemySwitch(beast); 
     } 

     private void EnemySwitch(Beast beast) 
     { 

      switch (beast) 
      { 
       case Beast.Bear: 
        Bear(); 
        break; 
       case Beast.Wolf: 
        Wolf(); 
        break; 
       case Beast.Boar: 
        Boar(); 
        break; 
      } 
     } 

     public void Bear() 
     { 
      HP = 120; 
      Attack = 20; 
      Defense = 15; 
      Name = "Bear"; 
     } 

     public void Boar() 
     { 
      HP = 100; 
      Attack = 30; 
      Defense = 10; 
      Name = "Boar"; 
     } 

     public void Wolf() 
     { 
      HP = 50; 
      Attack = 35; 
      Defense = 5; 
      Name = "Wolf"; 
     } 
    } 

    public class Undeads : Enemy 
    { 
     public Undeads() 
     { 
      Undead choice = RandomEnumValue<Undead>(); 
      EnemySwitch(choice); 
     } 

     public Undeads(Undead undead) 
     { 
      EnemySwitch(undead); 
     } 

     private void EnemySwitch(Undead undead) 
     { 
      switch (undead) 
      { 
       case Undead.Skeleton: 
        Skeleton(); 
        break; 
       case Undead.Ghost: 
        Ghost(); 
        break; 
       case Undead.Ghoul: 
        Ghoul(); 
        break; 
      } 
     } 

     private void Ghoul() 
     { 
      HP = 100; 
      Attack = 30; 
      Defense = 20; 
      Name = "Ghoul"; 
     } 

     private void Ghost() 
     { 
      HP = 100; 
      Attack = 30; 
      Defense = 20; 
      Name = "Ghost"; 
     } 

     private void Skeleton() 
     { 
      HP = 100; 
      Attack = 30; 
      Defense = 20; 
      Name = "Skeleton"; 
     } 
    } 

Есть ли способ, как сделать его работу таким образом? Или мне нужно использовать любое другое решение? Я новичок в ООП, и мне кажется, что это идеальный способ использовать Бестиари именно так, как я пытаюсь его использовать. Вывести конкретные группы и создать методы для определенных существ, не так ли? Лучшей будет, вероятно, какая-то база данных SQL, но для начала и понимания ООП я хочу идти этим путем.

Заранее благодарю за помощь! Счастливого Рождества!

+4

Как этот вопрос связан с C++? Это все C#. –

+0

Потому что программисты на С ++ более опытные в играх и имеют некоторые идеи, как это сделать правильно и показать мне путь. Поэтому любой совет от них был бы замечательным! – arthaqs

+0

Но я удалил тег C++, чтобы удовлетворить вас;) – arthaqs

ответ

0

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

public class Beasts 
{ 
    public Beasts(int a) { } 
} 

public class Enemy : Beasts 
{ 
    public Enemy() : base(5) { } 
} 
2

В языке агностик зрения объектно-ориентированное программирование, вот что я думаю, что вы должны сделать:

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

    public class Beast : Enemy  
    { 
        public Beast(HP, Attack, Defense, Name) { 
         this.HP = HP; 
         this.Attack = Attack; 
         this.Defense = Defense; 
         this.Name = Name; 
        } 
    } 
    
    public class Bear : Beast 
    { 
        public Bear() { 
         Beast(120, 20, 15, "Bear"); 
        } 
    } 
    
  2. Все классы должны содержаться в собственном файле (обычно).

  3. Вместо того, чтобы называть случайный класс, полученный от врага в конструкторе, вы хотите использовать Factory Pattern (https://en.wikipedia.org/wiki/Factory_method_pattern) в качестве другого отдельного класса. например

    public class EnemyFactory 
    { 
        public static Enemy getEnemy() { 
         // Logic previously in Enemy() constructor 
         return enemy; 
        } 
    } 
    

(я не знаю, C#, так что код может быть выключен)

+0

Спасибо, это очень полезно! Я пытаюсь использовать этот шаблон из Wiki, что довольно сложно (из-за интерфейсов и т. Д.), Но я могу узнать его и использовать! – arthaqs