请检查以下功能:
public void DoJob()
{
CheckPrivilege();
DoJob2();
}
public void DoJob2()
{
CheckPrivilege();
DoJob3();
}
如您所见,如果我拨打DoJob()
,CheckPrivilege()
功能会运行两次。有时我可以直接致电DoJob2()
,因此我无法从CheckPrivilege()
移除DoJob2()
功能。
所以我需要知道CheckPrivilege()
函数是在同一个调用堆栈中的另一个函数中调用的。
也就是说,我想在调用堆栈上共享一个Privilege对象。
这可能吗?如果是,怎么样?
答案 0 :(得分:0)
有很多方法可以做到,但“通过callstack共享”是不可能的。您可以保留一个状态变量,指示当前任务是否具有特权或执行此类操作。
function void DoJob()
{
CheckPrivilege();
DoJob2(false);
}
function void DoJob2(bool doPrivCheck)
{
if (doPrivCheck)
CheckPrivilege();
DoJob3();
}
答案 1 :(得分:0)
定义'内部'和'外部'接口函数。外部函数执行权限检查,任何人都可以调用;内部函数不进行检查,只应由实现调用。
将您的职能视为“外部”职能:
function void DoJob()
{
CheckPrivilege();
DoJob2_Internal();
}
function void DoJob2()
{
CheckPrivilege();
DoJob3_Internal();
}
function void DoJob2_Internal()
{
DoJob3_Internal();
}
该原则适用于任何语言 - 我不是C#程序员,因此我无法告诉您C#的哪些特定功能将强制执行访问控制或功能可见性,或者您是否必须依赖约定。