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

jos*_*ain 5 java oop class-hierarchy

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

我想到了两件事:

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

And*_*ier 10

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

HTH


Pet*_*eGO 5

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

就像您说的那样,除非它们具有某些基本功能-否则,它们应该是抽象的,从而迫使派生类提供实现。

如果某些派生类不应该为这些方法实现,则设计可能存在问题。

考虑一下:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我认为这是不好的。有人可能会这样做(您所描述的)。

public abstract class Animal
{
    public string Speak()
    {
        // not abstract because not all derived animals speak.
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这是更好的,但仍然不是很好。在这种情况下,我想看到的是要么将“说话”移到界面上,只有会说话的动物才能实现它,或者类似的东西。

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
{
}
Run Code Online (Sandbox Code Playgroud)