【发布时间】:2019-02-11 05:51:54
【问题描述】:
在我的工作中,我正在尝试创建更多模块化系统,因为我们倾向于在游戏中使用类似的机制,但差异很小。为此,我一直在使用接口,但一直被某些问题困扰,尤其是与添加小功能有关的问题。
示例:
以我们的进化系统为例。我创建了 IEvolvable 接口,它有一个进化级别的属性和一个 Evolve() 方法。
public interface IEvolvable
{
int evolution { get; }
bool IncreaseEvolution(int numEvolutions);
}
然后我在 Character 类上实现了这个接口,并且通过我的 Evolution 处理类基于某些条件,我想进化我的角色。
public class EvolutionHandler
{
public IEvolvable evolvable;
public void TryEvolveCharacter
{
if(someCondition)
{
evolvable.IncreaseEvolution(1);
}
}
}
然后,稍后我们会说,我们希望角色根据等级进化!极好的。我们有一个 ILevellable 接口,其中包含 Level、xp 等。
public interface ILevellable
{
int Level{ get; }
int MaxLevel{get;}
int XP {get;}
bool LevelUp(int numLevels);
}
我们可以根据级别的变化使用这些数据来控制进化发生的时间。但这是我的问题:
我的进化处理程序类接口与 IEvolvable...不是 ILevellable...那我该怎么办?
我可以让 IEvolvable 扩展 ILevellable,反之亦然...或者我可以创建一个扩展 IEvolvable 和 ILevellable 的新接口。现在我还必须修改我的进化处理程序以适应这些变化。
但是,如果我们不想让进化处理程序在我们的新游戏中再考虑关卡,会发生什么?使用旧代码吗?我是否应该扩展我的旧代码以包含 Ilevellable 接口?
public interface ILevelEvolver : ILevellable, IEvolvable
{
}
public class EvolutionHandler2
{
public ILevelEvolver levelEvolvable;
public void TryEvolveCharacter
{
if(levelEvolvable.Level > 10)
{
evolvable.IncreaseEvolution(1);
}
}
}
【问题讨论】:
-
每个 ILevelable、IEvolveable 都可以吗?我猜有些 ILevelable 不应该进化?
-
@EmrahSüngü 在我们制作的某些游戏中,Ilevelables 并不总是可以进化的。
-
你能告诉我
IEvolveableint evolution { get; }属性中的含义 -
@EmrahSüngü 所以一个可进化的可能有许多进化,这个数字将代表当前的进化。
-
Eric Lippert 写了一组很棒的帖子,标题为 Wizards and Warriors(链接到第 1 部分)。本系列的结论是 C# 的规则不太可能与您的游戏规则相匹配。因此,另一种方法是构建一个 rules 系统,您可以在其中实际建模您的规则,但不要尝试将其绑定到 C# 的类型系统。
标签: c# interface architecture