c# - 在向系统添加新功能时,如何避免不断更改界面?
问题描述
在我的工作中,我试图创建更多的模块化系统,因为我们倾向于在游戏中使用类似的机制,但差异很小。为此,我一直在使用接口,但一直被某些问题所困扰,尤其是与添加小功能有关的问题。
例子:
以我们的进化系统为例。我创建了 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);
}
}
}
解决方案
关键词是:
- 区分不同的和保持不变的
- SOLID原则之一:开放扩展封闭修改
最后在您的情况下将使用策略模式:
public interface IEvilutionChecker{
bool AllowEvolution();
}
public class EvolutionCheckerA : IEvilutionChecker{
private ILevellable levelEvolvable;
public EvolutionCheckerA(ILevellable levelEvolvable){
this.levelEvolvable = levelEvolvable;
}
public bool AllowEvolution(){
return levelEvolvable.Level > 10;
}
}
public class EvolutionCheckerB : IEvilutionChecker{
private IEvolvable evolvable;
public EvolutionCheckerB(IEvolvable evolvable){
this.evolvable = evolvable;
}
public bool AllowEvolution(){
return someCondition;
}
}
public class EvolutionHandler2
{
public IEvolvable evolvable;
public IEvilutionChecker EvolutionChecker {get;set;};
public void TryEvolveCharacter
{
if(EvolutionChecker.AllowEvolution())
{
evolvable.IncreaseEvolution(1);
}
}
}
推荐阅读
- xaml - 如何在此布局中创建 ScrollView?
- oracle - PLS-00103:在期待以下之一时遇到符号“IS”::=。( @ % ; 非空范围默认字符
- amazon-web-services - Control role permission in AWS
- html - 粘性位置和元素与另一个元素重叠的问题
- html - 我怎样才能用 CSS 制作这个形状?
- jmeter - 如何在 Jmeter 中运行具有负载分布的依赖采样器
- javascript - 可调整大小的视频不完全适合父 div
- javascript - TypeError:无法读取 null 的属性“appendChild”
- firefox - 如何在 Firefox 测试版中发布扩展
- powershell - Windows powershell中的Inkscape shell循环