Помощь в построении объектной модели - PullRequest
0 голосов
/ 22 сентября 2011

Помогите мне с моделью объекта строительства, пожалуйста.

Мне нужен абстрактный класс Unit, представляющий каждую воинскую часть в игре. Есть Soldier, Tank, Jet и Bunker (дети Юнита). Каждый из них имеет int свойства Count и Defense, конструктор с одним параметром int count и одним методом GetTotalDefense.

Моя идея заключается в следующем.

private abstract class Unit
{
    private int Count { get; set; }
    private const int Defense = 0;

    protected Unit(int count)
    {
        Count = count;
    }

    public int GetTotalDefense()
    {
        return Count * Defense;
    }
}

private class Tank : Unit
{
    private const int Defense = 5;
}

Каждый юнит имеет разные Count и разные Defense. Тело конструктора и тело GetTotalDefense всегда одинаковы. Что мне нужно находится в переопределении дочернего класса Defense, потому что у каждого модуля есть свои. Это свойство должно быть константным, все экземпляры танка (солдата, ...) имеют одинаковую защиту. Есть ли возможность наследовать свойство const, или каждому ребенку нужно собственное свойство const Defense?

А вот пример, который я хотел бы привести.

О, есть также класс войск

public class Troop
{
    private Soldier Soldiers { get; set; }
    private Tank Tanks { get; set; }
    private Jet Jets { get; set; }
    private Fort Forts { get; set; }

    public Troop(int soldiers, int tanks, int jets, int forts)
    {
        Soldiers = new Soldier(soldiers);
        Tanks = new Tank(tanks);
        Jets = new Jet(jets);
        Forts = new Fort(forts);
    }

    public int GetTotalDefense()
    {
        return Soldiers.GetTotalDefense() + Tanks.GetTotalDefense() + Jets.GetTotalDefense() + Forts.GetTotalDefense();
    }
}

Также не стесняйтесь предложить лучшее решение , спасибо.

PS: я очень строг в отношении модификаторов доступа, поэтому будьте точны в своих примерах, спасибо.

Ответы [ 4 ]

3 голосов
/ 22 сентября 2011

Вы не можете использовать const, но вы можете создать свойство только для чтения. Вы уверены, что хотите, чтобы классы были частными, а не внутренними или общедоступными?

public abstract class Unit { 

    protected Unit(int count) {
      Count=count;
    }

    protected int Count { get; private set; }
    protected abstract int Defense {get;}

    public int TotalDefense {
      get { return Count*Defense; }
    }

}

public class Tank : Unit {

   public Tank(int count) : base(count) {}

   protected override int Defense {
     get { return 5; }
   }
}

public class Troop {

   private Unit[] Troops;

   public Troop(int soldiers, int tanks, int jets, int forts) {
     Troops = new Unit[] {
                new Soldier(soldiers),
                new Tank(tanks),
                new Jet(jets),
                new Fort(forts)
              };
   }

   // The using System.Linq you can do
   public int TotalDefense {
     get { return Troops.Sum(x=>x.TotalDefense);}
   }
}
0 голосов
/ 22 сентября 2011

может быть как-то так (но это в Java)

abstract class Unit {
    Unit(int defense,int count) {
        this.defense = defense;
        this.count=count;
    }
    final int defense;
    int count;
}
class Soldier extends Unit {
    Soldier(int count) {
        super(1,count);
    }
}
class Tank extends Unit {
    Tank(int count) {
        super(5,count);
    }
}
public class Main {
    public static void main(String[] args) {
        Unit[] units = { new Soldier(2), new Tank(3) };
        for(Unit unit:units)
            System.out.println(unit.count+" "+unit.defense);
    }
}
0 голосов
/ 22 сентября 2011

То, что вы ищете, на самом деле readonly.Кроме того, поскольку Defense используется в подклассах, его необходимо защитить.

private abstract class Unit  
{  
    private int _Count;  
    protected readonly const int Defense;

    public int TotalDefense
    { get { return Count * Defense; } }

    protected Unit (int count, int defense)
    {
        Defense = defense;
        _Count = count;
    }
}  

private class Tank : Unit  
{
    public Tank (int Count)
        : base (Count, 5)
    { }        
}

public class Troop
{
    public IEnumerable<Unit> Units { get; protected set; }

    public Troop (int soldiers, int tanks, int jets, int forts)
    {
        Troops = new Unit[]
        {
            new Soldier (soldiers),
            new Tank (tanks),
            new Jet (jets),
            new Fort (forts)
        }
    }
}
0 голосов
/ 22 сентября 2011

Хотя это решение не использует const, оно достигает того, что вы хотите:

internal abstract class Unit
{
    private int Count { get; set; }
    private int Defense { get; set; }
    public int TotalDefense { get { return Count * Defense; } }

    protected Unit(int defense, int count)
    {
        Defense = defense;
        Count = count;
    }
}

internal class Tank : Unit
{
    protected Tank(int count)
        : base(5, count)  // you can use a const variable instead of 5
    {
    }
}

Или, может быть, это более подходит:

internal abstract class Unit 
{ 
    private int Count { get; set; } 
    public abstract int Defense { get; }
    public int TotalDefense { get { return Count * Defense; } }

    protected Unit(int count) 
    { 
        Count = count;
    }
} 

internal class Tank : Unit 
{
    override public int Defense { get { return 5; } }

    protected Tank(int count) : base(count)
    {
    } 
}
...