16

クラスを次のように定義することは可能ですか

public class MyClass
{
    public void methodA(){} // Inherit
    public void methodB(){} // Inherit
    public void methodC(){} // Require override
}

次に、 MyClass から拡張するすべてのクラスをオーバーライドする必要がありますmethodC()が、単に継承methodA()し、methodB()?

可能であれば、どのように行うのですか?それが不可能な場合、同様の結果を達成するための代替ソリューションを提案できますか?

編集:

このクラスもインスタンス化できるようにしたいので、非抽象クラスが必要です。

4

7 に答える 7

14

基本クラスを抽象化する必要があります。

public abstract class MyClass
{
    public void methodA(){} // Inherit
    public void methodB(){} // Inherit
    public abstract void methodC(); // Require override
}
于 2013-01-11T05:08:24.647 に答える
10

非抽象メソッドのオーバーライドを要求することはできません。

テンプレートメソッドのパターンに似たことができるかもしれません:

 public final void methodC() { methodC1(); someMoreLogic(); methodC2();}

 protected abstract void methodC1();

 protected abstract void methodC2();

ここで、methodC は、サブクラスによって提供される必要があるピースを呼び出す固定アルゴリズムをカプセル化します。

于 2013-01-11T05:09:25.470 に答える
2

私はあなたがまさにあなたが望むことをしているとは思わない。methodC()または、メソッド B()の抽象実装を持つ抽象クラスとして MyBaseClass を作成しますmethodA()。そこから MyClass を派生させ、 の実装を追加しmethodC()ます。その実装を継承させたくないクラスは、MyClass ではなく MyBaseClass を直接サブクラス化する必要があります。

于 2013-01-11T05:09:36.687 に答える
2

メソッドを継承したい場合は、finalキーワードを使用します。オーバーライドを強制するには、 make it abstract. ただし、非抽象子クラスのみがオーバーライドする必要があります。

于 2013-01-11T05:09:55.373 に答える
1

私の知る限り、抽象なしでJavaでメソッドを強制的にオーバーライドする方法はありません。

abstractメソッドを作成することで、クラスで達成できますmethod as abstract

于 2013-01-11T05:12:22.923 に答える
0

これを行う 1 つの方法は、abstract の代わりに virtual キーワードを使用することですが、オーバーライドする必要はありませんが、オーバーライドすることはできます。ただし、インスタンス化することはできます。

別のより推奨される方法は、クラスの要件を示すことができるインターフェイスを作成することです。抽象のようなもので、必要なものを示しますが、インターフェイスはクラスではないことに注意してください。それはポインタのようなものです。インターフェイスの詳細については、https ://docs.oracle.com/javase/tutorial/java/concepts/interface.html をクリックしてください。

于 2016-01-17T04:37:30.190 に答える