当前位置: 首页 > 知识库问答 >
问题:

接口重新实现的替代方案

陈法
2023-03-14

我正在阅读下面Joe Albahari优秀的“C9简而言之”的摘录,并试图理解这里用粗体描述的内容。有人能用我更能理解的方式解释替代方法吗?出于某种原因,这对我来说似乎有些落后。

public class TextBox : IUndoable
{
  void IUndoable.Undo()         => Undo();    // Calls method below
  protected virtual void Undo() => Console.WriteLine ("TextBox.Undo");
}

public class RichTextBox : TextBox
{
  protected override void Undo() => Console.WriteLine("RichTextBox.Undo");
}

共有1个答案

甄伟兆
2023-03-14

所描述的问题是,当基类实现接口时,该基类可能期望发生某些行为。

文本框撤消的示例。假设基文本框为撤消做了一些重要的工作(或者可能是实际的工作)。同样为了示例起见,假设在编写基类时,作者没有想到继承类(这里是richtextbox)

他本可以把它写成

public class TextBox : IUndoable
{
  void IUndoable.Undo() => ....... undo logic here
}
public class TextBox : IUndoable
{
  public void Undo() => ...... undo logic here
}
public class TextBox : IUndoable
{
  public virtual void Undo() => ...... undo logic here
}
public class TextBox : IUndoable
{
  void IUndoable.Undo()         => Undo();    // Calls method below
  protected virtual void Undo() => Console.WriteLine ("TextBox.Undo");
}

这为继承类实现它们自己的撤消提供了一个更安全的选项,而不会丢失基类的撤消(除非继承类也显式实现Iundoable,但我们不要去那里:p)

在richtextbox示例中,将重写撤消,但不调用基撤消。正是可能导致跳过“撤消”的基类实现的那种情况。但是在这里,如果某个东西(例如菜单项)调用Iundoableundo,则会调用显式实现,强制运行所需的基类undo功能,同时还会调用继承类(richtextbox)的重写实现

 类似资料:
  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • 我正在开发一个有ContentManager类的应用程序。该类从包中迁移文件,并在首次打开应用程序时执行其他检查。接下来,在一个相当长的ViewController链末端的view controller中使用它。据我所知,有两种实现方法: > 在第一个ViewController中实例化类,并将其通过segue传递到最终的ViewController。 在第一个ViewController中创建一

  • 我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。 如您所知,您可以使用whenNew关键字创建类的实例。 Junit5中是否有其他选择? 以下是我的代码的一部分:

  • Override Method可以实现接口方法也可以覆写父类的方法,但Implement Methods只能实现接口方法 操作步骤: 菜单栏: Code —> Implement Methods 快捷键: Mac: control + L Windows\/Linux: Ctrl + I

  • 问题内容: 我有一个viewcomponent,其中包含一些嵌入在各个页面中的可重用业务逻辑。这一直很好。但是,我现在需要使用ajax刷新viewcomponent。 有什么办法可以做到这一点?从我所读的内容来看,这是不可能的,尽管该信息有些过时了。如果不可能的话,最好的选择是什么? 问题答案: 在beta7上,现在可以直接从控制器返回ViewComponent。查看公告的“ MVC /剃刀”部分

  • https://kubernetes.io/docs/concepts/services-networking/Ingress/中的入口示例显示,为了指定bancked入口,我们必须指定servicePort和serviceName,例如: 我希望创建具有随机端口的服务,并避免在入口定义中指定它们。有没有ServicePort的替代方案?也许使用服务中分配的端口名称或targetPort?