内部接口 - 暴露我的无知

时间:2009-03-17 09:25:59

标签: c# interface access-modifiers

我知道these two个问题可以解释为什么我不能在接口中使用受保护/私有方法,我正在尝试解决的问题是如何控制简要地从我的方法调用

public class EditField : IEditField
{
    public EditField() {}
    public EditField(IStateMachine stateMachine) {}
    public void Action_Commit() {}
    public void Action_Undo() {}
}

消费者可以使用默认的IStateMachine,也可以使用自己的。

我想知道是否有任何方法可以确保只从IStateMachine中调用Action_方法,这样消费者就不会开始搞乱状态。我怀疑没有办法做到这一点,但我想知道我是否遗漏了一些东西。我不是设计模式大师。

3 个答案:

答案 0 :(得分:3)

嗯,你可以做的是通过明确地实现这些方法来“隐藏”Action_方法。

如果这样做,用户只能在将类强制转换回界面时调用这些方法。 但是,它不会阻止他们调用这些方法,但也许它会使它变得不那么明显。

public class EditField : IEditField
{
    public EditField( IStateMachine stateMachine ) {}

    void IEditField.Action_Commit() {}

    void IEditField.Action_Undo() {}

}

通过实现这样的方法,用户将无法执行此操作:

EditField ef = new EditField();
ef.Action_Commit(); // compile-error

但是,如果他们这样做,可以调用这些方法:

IEditField ef = new EditField();
ef.Action_Commit();

EditField ef = new EditField()
((IEditField)ef).Action_Commit();

但是,这不是一个更好的解决方案/可能会有这些提交&撤消IStateMachine的一部分方法呢?

并且,如果你不能修改设计以使那些提交&撤消IStateMachine的方法部分,那么也许你可以创建一个抽象类而不是IEditField接口?
在该抽象类中,您可以使这些Action_方法受到保护。

答案 1 :(得分:3)

虽然你不能在接口上拥有访问修饰符,但是这是隐藏成员的一种方法,但是让IStateMachine实现者可以访问它们。

public interface IEditActions
{
  void Action_Commit() {}
  void Action_Undo() {}
}

public interface IStateMachine
{
  void Initialize(IEditActions editActions);
}

public class EditField : IEditField
{
  private class EditActions : IEditActions
  {
    EditField _editField;

    public EditActions(EditField editField)
    {
      _editField = editField;
    }

    public void Action_Commit()
    {
      _editField.Action_Commit();
    }
    public void Action_Undo()
    {
      _editField.Action_Undo();
    }
  }

  public EditField() {}
  public EditField(IStateMachine stateMachine)
  {
    stateMachine.Initialize(new EditActions(this));
  }

  private void Action_Commit() {}
  private void Action_Undo() {}
}

答案 2 :(得分:0)

我不确定我明白你想做什么。但为了隐藏内容,我通常会明确地实现接口。如果有人需要访问某些内容而不是其他内容,那么您也应该将界面拆分为两个或类似内容。