抽象类中是否有任何空的具体方法?

我最近在查看一些开源代码PicketLink代码。 如果你看一下这个类 ,你会在抽象类中看到一些什么都不做的具体方法。 这有什么用途吗?

我想到了两件事:

  1. 如果该方法需要被子类覆盖而未在父抽象类中定义,为什么不简单地将其设为抽象?
  2. 如果只有一些子类实际上需要实现该方法,那么这是否表明需要重构类层次结构,以便不强迫孩子使用不适用的方法?

虽然不是最常见的情况,但有时它在模板方法的上下文中很方便。 在这种情况下,有一个方法定义流程,将一些部分的具体实现留给其子类。 在某些情况下,默认的具体行为是什么都不做,将基类中的具体方法留空,但允许通过覆盖它来在子类中进行自定义。

HTH

基于Andres Fortier的答案,您还将在Swing中看到这种模式,包括各种EventListener Adapter类。 例如, MouseAdapter为每个侦听器方法提供相应的空方法。 这允许接口定义所有相关方法,但实现扩展相应的适配器并仅覆盖它们关心的单个方法,而不是强制为所有其他接口方法提供空体。

我个人认为这是一种代码味道。

就像你说的,除非他们有一些基本的function – 他们没有,他们应该是抽象的,迫使派生类提供实现。

如果某些派生类不应该有这些方法的实现,那么设计可能有问题。

考虑一下:

public abstract class Animal { public abstract string Speak(); } public class Dog : Animal { public override string Speak() { Console.WriteLine("Woof"); } } public class Cat : Animal { public override string Speak() { Console.WriteLine("Meow"); } } 

到目前为止一切都很好,但如果你想添加一个不说话的动物怎么办?

 public class Ant : Animal { public override string Speak() { // do nothing - ants don't speak. } } 

这在我看来很糟糕。 有人可能会这样做(你所描述的)。

 public abstract class Animal { public string Speak() { // not abstract because not all derived animals speak. } } 

在我看来,这更好,但仍然不是很好。 我想在这种情况下看到的是Speak被移动到一个界面,只有可以说话的动物实现它,或类似的东西。

 public abstract class Animal { } public abstract class Mammal : Animal { public abstract string Speak(); } public class Dog : Mammal { public override string Speak() { Console.WriteLine("Woof"); } } public class Cat : Mammal { public override string Speak() { Console.WriteLine("Meow"); } } public class Ant : Animal { }