6

私は最近、いくつかのオープンソースコードのPicketLinkコードを調べていました。このクラスを見ると、何もしない抽象クラスの具体的なメソッドがいくつかあります。これには何か目的はありますか?

私は2つのことについて考えました:

  1. メソッドをサブクラスでオーバーライドする必要があり、親の抽象クラスで定義する必要がない場合は、単に抽象化してみませんか?
  2. 一部の子クラスのみが実際にメソッドを実装する必要がある場合、これは、子が適用できないメソッドを持つことを強制されないように、クラス階層を再構築する必要があることを示しているのではないでしょうか。
4

3 に答える 3

10

最も一般的なケースではありませんが、テンプレート メソッドのコンテキストで便利な場合があります。この場合、フローを定義するメソッドがあり、一部の部分の具体的な実装はそのサブクラスに任せます。場合によっては、デフォルトの具体的な動作は何もせず、基本クラスの具体的なメソッドを空のままにし、オーバーライドすることでサブクラスのカスタマイズを許可します。

HTH

于 2012-12-07T21:02:15.417 に答える
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");
    }
}

これまでのところすべて問題ありませんが、話せない動物を追加したい場合はどうでしょうか。

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
{
}
于 2012-12-07T21:14:02.640 に答える
4

Andres Fortier の回答に基づいて構築すると、さまざまな EventListener Adapter クラスを使用して、Swing でもこのパターンが多く見られます。たとえば、MouseAdapterは、各リスナー メソッドに対応する空のメソッドを提供します。これにより、インターフェイスは関連するすべてのメソッドを定義できますが、実装は対応するアダプターを拡張し、他のすべてのインターフェイス メソッドに空の本体を提供することを余儀なくされるのではなく、関心のある単一のメソッドのみをオーバーライドします。

于 2012-12-07T21:25:15.873 に答える