我知道these two个问题可以解释为什么我不能在接口中使用受保护/私有方法,我正在尝试解决的问题是如何控制简要地从我的方法调用:
public class EditField : IEditField
{
public EditField() {}
public EditField(IStateMachine stateMachine) {}
public void Action_Commit() {}
public void Action_Undo() {}
}
消费者可以使用默认的IStateMachine,也可以使用自己的。
我想知道是否有任何方法可以确保只从IStateMachine中调用Action_方法,这样消费者就不会开始搞乱状态。我怀疑没有办法做到这一点,但我想知道我是否遗漏了一些东西。我不是设计模式大师。
答案 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)
我不确定我明白你想做什么。但为了隐藏内容,我通常会明确地实现接口。如果有人需要访问某些内容而不是其他内容,那么您也应该将界面拆分为两个或类似内容。