我最近在查看一些开源代码PicketLink代码。如果你看一下this class,你会在抽象类中看到一些什么都不做的具体方法。这有什么目的吗?
我想到了两件事:
答案 0 :(得分:9)
虽然不是最常见的情况,但有时它在template method的上下文中很方便。在这种情况下,有一个定义流的方法,将一些部分的具体实现留给其子类。在某些情况下,默认的具体行为是什么都不做,将基类中的具体方法留空,但允许通过覆盖它来在子类中进行自定义。
HTH
答案 1 :(得分:4)
我个人认为这是一种代码味道。
就像你说的,除非他们有一些基本的功能 - 他们没有,他们应该是抽象的,迫使派生类提供实现。
如果某些派生类不应该有这些方法的实现,那么设计可能有问题。
考虑一下:
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
{
}
答案 2 :(得分:4)
根据Andres Fortier的回答,您还可以在Swing中看到这种模式,包括各种EventListener Adapter类。例如,MouseAdapter为每个侦听器方法提供相应的空方法。这允许接口定义所有相关方法,但实现扩展相应的适配器并仅覆盖它们关心的单个方法,而不是强制为所有其他接口方法提供空体。