播放器属性接口
Interfaces for Player Attributes
代表玩家每个属性的界面是否合适class?这有问题吗?
随着属性被添加到模型中,接口也会导致声明过长。
public class Player : INamed, IEnergy, IInventory, IMana, ...
{
public string Name { get; set; }
public int Energy { get; set; }
public int Mana { get; set; }
public Inventory Backpack { get; }
...
}
对我来说,这会告诉我并非所有玩家都有名字、能量等。对于基本游戏,所有单位通常都有某种名称和一系列生命值,表示玩家可以造成多少伤害单位占用
如果所有你游戏中的单位具有相似的属性但不同值(也许牧师比士兵能承受更少的伤害,但可以移动得更快,因为它没有装甲),你可以定义一个接口来指定你的单位的行为,因此你可以有这样的东西:
public interface IBaseUnit
{
int HitPoints
..
}
然后,每个特定的单元都会有自己的实现。话虽如此,我认为这些单元在大多数情况下都会以类似的方式运行,因此,使用抽象 class 而不是层次结构顶部的接口可能更有效。
在我看来,您需要的是 class 层次结构,而不是一堆接口。与其构建不同角色可以拥有的大型 "properties" 池,不如建议您使用具体单元继承自的一些基本抽象 class 对某种层次结构进行建模。
基本思路:
abstract class Character
{
String name
int hitpoints;
IList<Item> inventory;
}
abstract class Spellcaster : Character
{
int manapoints;
IList<Spell> knownSpells;
}
class Mage : Spellcaster
{
// Mage specific stuff
}
class Necromancer : Spellcaster
{
// Necromancer specific stuff
}
等等。显然,您建模的 classes 将取决于您制作的游戏类型。
代表玩家每个属性的界面是否合适class?这有问题吗?
随着属性被添加到模型中,接口也会导致声明过长。
public class Player : INamed, IEnergy, IInventory, IMana, ...
{
public string Name { get; set; }
public int Energy { get; set; }
public int Mana { get; set; }
public Inventory Backpack { get; }
...
}
对我来说,这会告诉我并非所有玩家都有名字、能量等。对于基本游戏,所有单位通常都有某种名称和一系列生命值,表示玩家可以造成多少伤害单位占用
如果所有你游戏中的单位具有相似的属性但不同值(也许牧师比士兵能承受更少的伤害,但可以移动得更快,因为它没有装甲),你可以定义一个接口来指定你的单位的行为,因此你可以有这样的东西:
public interface IBaseUnit
{
int HitPoints
..
}
然后,每个特定的单元都会有自己的实现。话虽如此,我认为这些单元在大多数情况下都会以类似的方式运行,因此,使用抽象 class 而不是层次结构顶部的接口可能更有效。
在我看来,您需要的是 class 层次结构,而不是一堆接口。与其构建不同角色可以拥有的大型 "properties" 池,不如建议您使用具体单元继承自的一些基本抽象 class 对某种层次结构进行建模。
基本思路:
abstract class Character
{
String name
int hitpoints;
IList<Item> inventory;
}
abstract class Spellcaster : Character
{
int manapoints;
IList<Spell> knownSpells;
}
class Mage : Spellcaster
{
// Mage specific stuff
}
class Necromancer : Spellcaster
{
// Necromancer specific stuff
}
等等。显然,您建模的 classes 将取决于您制作的游戏类型。