继承解决方案

时间:2012-08-17 16:51:10

标签: c# .net inheritance polymorphism

我一直在努力构建几个继承自一个基类的类,但我对现在C#中的继承和多态如何工作并不完全有信心。

我的基类看起来像这样:

abstract class Structure
    {
        public int currentCost = 0;
        public int currentArea = 0;
        public int currentPopulation = 0;
        public int currentConstruction = 0;
        public int currentEnergy = 0;
        public int currentEconomy = 0;

        public abstract int baseCost { get; }
        public abstract int baseEnergy { get; }
        public abstract int baseEconomy { get; }
        public abstract int baseConstruction { get; }
        public int baseArea = -1;
        public int basePopulation = -1;

        public int level = 0;
        public abstract string structureName { get; }
}

现在,继承自Structure类的类将为抽象变量提供自己的赋值,这很好,因为大多数类在它们分配的数字中变化很大。 抽象变量以下列(不完整)方式用于派生类中:

class BiosphereModification : Structure
    {
        const int baseEconomyBiosphereModification = 0;
        const int baseConstructionBiosphereModification = 0;
        const int baseCostBiosphereModification = 2000;
        const int baseEnergyBiosphereModification = 0;
        const int baseFertilityBiosphereModification = 1;
        const string structureNameBiosphereModification = "BiosphereModification";

        public override int baseCost { get { return baseCostBiosphereModification; } }
        public override int baseEconomy { get { return baseEconomyBiosphereModification; } }
        public override int baseEnergy { get { return baseEnergyBiosphereModification; } }
        public override int baseConstruction { get { return baseConstructionBiosphereModification; } }
}

但是,非抽象变量在大多数派生类中都是相同的,但不是全部。

我可以将它们全部抽象化并强制每个类提供它自己的值,但这似乎是违反直觉的。我更喜欢的是一种在基类中提供值并在需要时在派生类中提供覆盖的方法。

有办法做到这一点吗?我知道这可以使用声明为virtual的方法来完成。这允许派生类使用基类方法,除非它提供它自己的一个。当然存在类似的事情吗?

1 个答案:

答案 0 :(得分:3)

  

我更喜欢的是一种在基类中提供值并在需要时在派生类中提供覆盖的方法。

属性也可以声明为虚拟:

public virtual int BaseCost { get { return 0; } }
public virtual int BaseEnergy { get { return 42; } }
public virtual int BaseEconomy { get { return 3982; } }
public virtual int BaseConstruction { get { return 398829; } }

然后您可以在适当时覆盖它们:

public override int BaseCost { get { return 2; } }