7

これら2つのクラスがあり、一方が他方を拡張しているとしましょう

public class Bar{

    public void foo(){

    }

}

public class FooBar extends Bar {

    @Override
    public void foo(){
        super.foo(); //<-- Line in question
    }

}

私がやりたいことは、ユーザーがfooオーバーライド メソッドにない場合、スーパークラスのメソッドを呼び出すようにユーザーに警告することです。これは可能ですか?

または、クラス型をスーパーに渡すと、スーパークラスのメソッドをオーバーライドするメソッドが元のメソッドを呼び出すことをリフレクションを使用して知る方法はありますか?

例えば:

public abstract class Bar{

    public Bar(Class<? extends Bar> cls){
        Object instance = getInstance();
        if (!instance.getClass().equals(cls)) {
            throw new EntityException("The instance given does not match the class given.");
    }
        //Find the method here if it has been overriden then throw an exception
        //If the super method isn't being called in that method
    }

    public abstract Object getInstance();

    public void foo(){

    }

}

public class FooBar extends Bar {

    public FooBar(){
        super(FooBar.class);
    }

    @Override
    public Object getInstance(){
        return this;
    }

    @Override
    public void foo(){
        super.foo();
    }

}

スーパーメソッドに注釈を付けて、呼び出す必要があることを示すこともできますか?


編集

foo メソッドを呼び出す必要があるのはスーパークラスではなく、サブクラスの foo メソッド (データベースcloseメソッドなど) を呼び出す人であることに注意してください。

メソッドを「オーバーライド不可」にすることにも満足しますが、それでもカスタムメッセージを付けたいと思います。


編集 2

これは私がある意味で望んでいたものです:

ここに画像の説明を入力

しかし、上記のようにしたり、別のことをするようにカスタム メッセージを与えたりすることもできます。Cannot override the final method from Bar, please call it from your implementation of the method instead

4

2 に答える 2

4

編集:編集された質問に答えるには、次のものが含まれます。

メソッドを「オーバーライド不可」にすることにも満足しています

... メソッドを作成するだけfinalです。これにより、サブクラスがそれをオーバーライドできなくなります。JLS のセクション 8.4.3.3から:

メソッドを宣言finalして、サブクラスがオーバーライドまたは非表示にならないようにすることができます。

メソッドをオーバーライドまたは非表示にしようとすると、コンパイル時エラーになりますfinal

元の質問に答えるには、代わりにテンプレート メソッド パターンを使用することを検討してください。

public abstract class Bar {
    public foo() {
        // Do unconditional things...
        ...
        // Now subclass-specific things
        fooImpl();
    }

    protected void fooImpl();
}

public class FooBar extends Bar {
    @Override protected void fooImpl() {
        // ...
    }
} 

もちろん、サブクラスのFooBarオーバーライドfooImplと呼び出しを強制するわけではありませんが、同じパターンを再度適用することでこれを行うことができます。独自の実装を最終的なものにし、新しい保護された抽象メソッドを導入します。super.fooImpl()FooBar fooImpl

于 2013-10-12T05:47:22.957 に答える
0

あなたができることは、次のようなものです

public class Bar{

    public final void foo(){
        //do mandatory stuff
        customizeFoo();
    }

    public void customizeFoo(){

    }

}

public class FooBar extends Bar {

    @Override
    public void customizeFoo(){
        //do custom suff
    }

}

サブクラスがオーバーライドできず、必須の処理を回避できないように、スーパークラスで foo メソッドが「最終」になりました

于 2013-10-12T05:48:11.497 に答える