没有任何理由为一个抽象类,一个空的具体方法?(Is there any reason for an

2019-07-04 18:32发布

我最近在寻找通过一些开放的源代码PicketLink代码。 如果你看看这个类 ,你会看到什么也不做,抽象类的一些具体方法。 有没有任何目的的呢?

我想到两两件事:

  1. 如果该方法需要子类将覆盖在父抽象类没有定义,为什么不干脆让抽象的?
  2. 如果只有部分子类实际上需要实现的方法,不会这个指示的类层次结构的调整的需要,让孩子们不会被强迫有不适用的方法呢?

Answer 1:

虽然不是最常见的情况,有时它是在一个背景下得心应手模板方法 。 在这种情况下,存在定义的流动,离开的具体实施某些部分及其子类的方法。 在某些情况下,默认的具体表现是什么也不做,通过重写它留在基类中的具体方法为空,但允许在子类中定制。

HTH



Answer 2:

建立关福捷安德烈的回答,你也会看到这个模式很多秋千,与各种事件监听适配器类。 例如, MouseAdapter提供对应于每个侦听方法空方法。 这使得界面来定义所有相关的方法,但是在实现扩展对应的适配器,只覆盖他们所关心的一个方法,而不是被强迫为所有其它接口方法提供空的机构。



Answer 3:

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

像你说的,除非他们有一些基本的功能 - 他们不这样做,他们应该是抽象的,迫使派生类提供实现。

如果一些派生类不应该对这些方法的实现,那么就可能出错的设计。

试想一下:

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.
    }
}

这在我看来,是更好的,但仍然不是很大。 我想在这种情况下看到的是无论是说话被移动到一个接口,只有动物会说话的实现,或者是这样的。

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
{
}


文章来源: Is there any reason for an empty concrete method in an abstract class?