我是C#的新开发人员,并且我正在使用unity3d开发游戏。
我设计了一个接口来实现游戏中的技能系统。但是我发现了一些麻烦。这里有很多Skill
类,我必须在它们的show()
内部手动调用apply
方法。
interface ISkill
{
void apply();
}
class Base
{
protected string name { get; set; }
protected void show()
{
Console.WriteLine("show:"+name);
}
}
class Skill1 : Base, ISkill
{
public Skill1()
{
name = "skill1";
}
public void apply()
{
show();
Console.WriteLine("skill1 apply");
}
}
class Skill2 : Base, ISkill
{
public Skill2()
{
name = "skill2";
}
public void apply()
{
show();
Console.WriteLine("skill2 apply");
}
}
Skill3
Skill4
etc..
class Program
{
public static void Main(string[] args)
{
ISkill skill = new Skill2();
skill.apply();
}
}
如何修改我的代码,以便所有SkillX
类都可以在show()
方法中自动调用apply()
方法?
答案 0 :(得分:2)
为此的标准解决方案是template method。
基类将方法实现为“模板”,它强制派生类为该方法提供特定步骤。在您的情况下,Base
类应实现首先调用Apply
的{{1}}方法,然后通过强制它们通过Show
提供第二部分的实现,将其余的委托给派生类。 :
abstract void ApplyImplementation()
答案 1 :(得分:0)
除了尝试将不同类之间的共性拉到基础上之外,没有其他通用的解决方案。
在您的情况下,由于apply()
之间的唯一区别似乎是技能名称,并且您已经将其作为实例属性,因此可以将apply
向上拉至{{1 }},并且在Base
的所有子类中都具有相同的实现。
Base