我最近在寻找通过一些开放的源代码PicketLink代码。 如果你看看这个类 ,你会看到什么也不做,抽象类的一些具体方法。 有没有任何目的的呢?
我想到两两件事:
- 如果该方法需要子类将覆盖在父抽象类没有定义,为什么不干脆让抽象的?
- 如果只有部分子类实际上需要实现的方法,不会这个指示的类层次结构的调整的需要,让孩子们不会被强迫有不适用的方法呢?
我最近在寻找通过一些开放的源代码PicketLink代码。 如果你看看这个类 ,你会看到什么也不做,抽象类的一些具体方法。 有没有任何目的的呢?
我想到两两件事:
虽然不是最常见的情况,有时它是在一个背景下得心应手模板方法 。 在这种情况下,存在定义的流动,离开的具体实施某些部分及其子类的方法。 在某些情况下,默认的具体表现是什么也不做,通过重写它留在基类中的具体方法为空,但允许在子类中定制。
HTH
建立关福捷安德烈的回答,你也会看到这个模式很多秋千,与各种事件监听适配器类。 例如, MouseAdapter提供对应于每个侦听方法空方法。 这使得界面来定义所有相关的方法,但是在实现扩展对应的适配器,只覆盖他们所关心的一个方法,而不是被强迫为所有其它接口方法提供空的机构。
我个人认为这是一个代码味道。
像你说的,除非他们有一些基本的功能 - 他们不这样做,他们应该是抽象的,迫使派生类提供实现。
如果一些派生类不应该对这些方法的实现,那么就可能出错的设计。
试想一下:
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
{
}