管理接口实现成员的可访问性

本文关键字:访问 成员 接口 实现 管理 | 更新日期: 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接口访问接口元素,将接口标记为内部接口,并假设开发人员不会在内部滥用此类型。