如果调用类没有在.Net(C#)中实现特定接口,如何限制对成员函数的访问权限
例如:
实现 IProfessor 的类只能访问 IStudent.SetGrade 方法。
答案 0 :(得分:1)
你可以考虑的一个选项,实际上可能有意义,因为大概IProfessor
也可以只为他们教授的学生/他们的课程/科目等设定成绩......
IStudent
没有SetGrade
方法,只有
GetGradeSetterFor(IProfessor教授)
返回允许设置适当等级的对象。即包含“业务逻辑”的对象决定了谁可以设置什么。并且通过(例如)将代表或参考传递给私人领域,可以访问学生的私人方法。
实际上,当你允许研究生等等GetGradeSetterFor(IGrader grader)
可以实施的成绩时,你可能想要IProfessor
。
当然,你总是可以调用aStudent.GetGradeSetterFor(null)
,但它是在签名中与调用者进行通信,他们可能会遇到问题,而调用类型的简单运行时检查不是。
您也可以将IProfessor
作为SetGrade
的参数,甚至是IProfessor中的一个很好的扩展方法,因此aStudent.SetGrade(aProfessor, args)
变为aProfessor.SetGrade(aStudent, args)
。
这些都不会导致传入null的编译时间问题,但是您正在警告开发人员在这种情况下可能需要 。
答案 1 :(得分:0)
你不能编译时间,而是运行时。
从基类型(IPerson)派生IProfessor,并使用该基类型的实例调用SetGrade。
public SchoolStudent : IStudent
{
void SetGrade(IPerson, int grade)
{
if (IPerson is IProfessor)
{
set grade ...
}
}
}
public interface IProfessor : IPerson
{
...
}
public interface IPerson
{
}
答案 2 :(得分:0)
首先,由于几个原因,这不是好的做法。例如,请参阅IS there any way to get a reference to the calling object in c#?
无视我认为可以使用以下内容:
void IStudent.SetGrade(int grade)
{
StackFrame frame = new StackFrame(1);
var method = frame.GetMethod();
var matchingInterface = method.DeclaringType.FindInterfaces(MatchType, null).ToList();
if (matchingInterface.Count > 0)
{
//...
}
}
private bool MatchType(Type m, object filterCriteria)
{
return m == typeof(IProfessor);
}