5

Abstract クラスの実装クラスがメソッドのスコープを保護からパブリックに変更することを制限するにはどうすればよいですか?

例:抽象クラスがあるとします

package com.rao.test;

public abstract  class AbstractTEClass {

    protected abstract void function1();

    protected abstract void function2();


    protected void doWork() //I want to call the abstract methods from this method.
    {
        function1(); //implementation classes will give implementation of these methods
        function2();

    }

}

今、私は上記の抽象クラスを拡張する実装クラスを持っています

package com.rao.test;

public class AbstractTEClassImpl extends AbstractTEClass {

    @Override
    public void function1() {
        // TODO Auto-generated method stub
        System.out.println("FUnction1");
    }

    @Override
    public void function2() {
        // TODO Auto-generated method stub
        System.out.println("Function2");
    }


    public static void main(String[] args)
    {
        AbstractTEClassImpl objTEClass = new AbstractTEClassImpl();

        objTEClass.doWork();

    }

}

ここで、実装クラスの 2 つの抽象メソッドのスコープを保護からパブリックに変更していることに注意してください。実装クラスがスコープを変更しないように制限するにはどうすればよいですか。
デザインの変更や推奨事項、パターンは大歓迎です。

4

3 に答える 3

6

できません。

オーバーライド クラスは、オーバーライドしているメソッドよりも多くのアクセスを常にメソッドに与えることができます。

ここの修飾子に関するセクションを読んでくださいhttp://docs.oracle.com/javase/tutorial/java/IandI/override.html

オーバーライド メソッドのアクセス指定子は、オーバーライドされたメソッドより多くのアクセスを許可できますが、少なくはできません。たとえば、スーパークラスの保護されたインスタンス メソッドは、サブクラスでは公開できますが、非公開にすることはできません。

スーパークラスのインスタンス メソッドをサブクラスのクラス メソッドに、またはその逆に変更しようとすると、コンパイル エラーが発生します。

于 2012-07-05T11:58:50.050 に答える
5

それを行う方法はありません。サブクラスがこのメソッドをアクセス可能にしたいのなら、なぜそうすべきではないのでしょうか? とにかく、親抽象クラスのユーザーには影響しません。

于 2012-07-05T11:59:30.427 に答える
3

できません。私はあなたがやりたいことはいじくり回しているのではないかとdoWork()思います。そうすれば、関数1と2のオーバーライド内で拡張クラスが行う可能性のある悪用に耐えることができます。メソッドを追加したり、それらのメソッドの機能を変更したりすることもできます。

オーバーライドは便利なことです。Microsoftはオーバーライドを防ぐためにすべてを「シール」するため、C#での作業に本当にイライラすることがよくあります。(私は誇張しています。それらは私がオーバーライドしたいメソッドを封印するだけです。)そのルートに行かないでください。あなたの本当の問題が何であるかを理解し、あなたの基本的なAbstractTEClassクラスでそれを処理してください。

于 2012-07-05T20:07:36.030 に答える