管理接口实现成员的可访问性
本文关键字:访问 成员 接口 实现 管理 | 更新日期: 2023-09-27 18:16:30
我有一个有趣的场景,我一直在思考,想知道什么解决方案可能有一个比我提出的更优雅的解决方案。
考虑以下类型
public class Session : ISessionGraphTransitionHandler
{
public void Handler1()
{
// do stuff that leverages this object instance
}
public void Handler2()
{
// do stuff that leverages this object instance
}
// ...
public void HandlerN()
{
// do stuff that leverages this object instance
}
private Graph sessionGraph;
public Session()
{
sessionGraph = new Graph(this); // where ISessionGraphTransitionHandler is expected
}
}
当前的界面看起来是这样的:
public interface ISessionGraphTransitionHandler
{
public void Handler1();
public void Handler2();
...
public void HandlerN();
}
所有这一切的问题是,外部演员可以调用sessionInstance.Handler1()
内部似乎可以在某种程度上解决这个问题,但我正在寻找其他解决方案。这里的想法是图形应该调用父类。这是设计味吗?有更好的方法来解决这个问题吗?
实际类型未清理并张贴在这里。
我不确定我是否理解对了你的问题,所以我猜了一点。
public interface IHandler
{
void Handle();
}
public class HandlerDirector
{
IList<IHandler> Handlers = new List<IHandler>();
public void AddHandler(IHandler handler)
{
Handlers.Add(handler);
}
public void RunAllHandlers()
{
foreach (IHandler handler in Handlers)
handler.Handle();
}
}
现在外部代码使用AddHandler(IHandler handler)添加处理程序,并使用RunAllHandlers()运行所有处理程序。
如果不更多地了解您试图解决的问题以及可能解决方案的约束,就很难回答这个问题。但是,听起来您可能需要使用子类化和受保护成员。因此,例如,您可以将Handler1()...HandlerN()
留在接口之外,而不是在父类中声明它为受保护的,如果您想在子类中强制实现,也可以将其声明为抽象的。
public class ParentClass
{
protected abstract void Handler1();
...
protected abstract void HandlerN();
}
public class Session : ParentClass, ISessionGraphTransitionHandler
{
private void Handler1();
...
private void HandlerN();
}
任何外部参与者无法访问的东西都可以是ParentClass
的抽象成员。任何公开的东西都可以成为ISessionGraphTransitionHandler
的成员。
这就引出了一个问题:如果你想要限制,为什么要使用接口呢外部参与者不能访问接口中的所有方法。
一个合理的解决方案是利用c#中的显式接口实现机制,只允许通过IEncounterTransitionHandler接口访问接口元素,将接口标记为内部接口,并假设开发人员不会在内部滥用此类型。