2016-04-10 17 views
1

状況は次のとおりです。クラスがあり、インスタンスを作成します。クラスのメソッド/変数の大部分を継承したいのですが、抽象クラスの仕組みと同様に、いくつかのメソッドをオーバーライドする必要があります。クラスのインスタンスにメソッドをオーバーライドする必要があります

ここまでは私のコードです。

public class Example { 
    public void methodOne() { 
     //Inherited 
    } 
    public void methodTwo() { 
     //Interited 
     //Maybe calls methodThree() as a part of its function 
    } 
    public void methodThree() { 
     //Override Me 
    } 
} 
+5

だから抽象化してください。 – SLaks

+1

このクラスのインスタンスを作成するので、抽象化できないと思いますか? – schwobaseggl

+0

@SLaks質問で言及したように、インスタンスを作成する必要があるため、私はできません –

答えて

1

私はインスタンス

インスタンス化を防ぐないクラスの抽象を作るを作成する必要があるので、私は[クラス抽象を作る]ことはできませんが、インスタンス化を防ぎたいので、方法がない限り、これは正しいことです。

あなたは匿名でオーバーライドを行うことができますので、文法的にこれは、基本クラスをインスタンス化のようになります。すべての

public abstract class Example { 
    public void methodOne() { 
     //Inherited 
    } 
    public void methodTwo() { 
     //Interited 
     //Maybe calls methodThree() as a part of its function 
    } 
    public abstract void methodThree(); 
} 
... 
static void main(String[] args) { 
    Example e = new Example() { 
     @Override 
     public void methodThree() { 
      ... // Do something 
     } 
    }; 
} 
+0

抽象クラスのインスタンス変数は、すべての抽象メソッド/変数をオーバーライドする限り作成できます。 –

+0

はい、正しいです。 –

+0

@AllenF。それは事です - それはもはやあなたがインスタンス化している抽象クラスではありません。この構文は 'Example'から派生した匿名クラスを生成しますが、抽象メソッドをオーバーライドするため、匿名クラスは抽象クラスではなくなりました。 – dasblinkenlight

0

まず、カウンタ生産性を高めることができ、特定の方法でコードを書くこと人を必要と。誰かが合法的なユースケース()を持っているかもしれませんが、それはあなたの制限が存在しない場合よりも著しく悪くなるような方法で問題を解決するかもしれません。 ...心の中で

これを負担する。しかし、ここソリューションです:

public abstract class ExampleBase { 
    public void methodOne() { 
     // Inherited 
    } 

    public void methodTwo() { 
     // Interited 
     // Maybe calls methodThree() as a part of its function 
    } 

    public abstract void methodThree(); 
} 

public final class Example { 
    @Override 
    public void methodThree() { 
     // Do stuff. 
    } 
} 

私たちはあなたの抽象スーパークラスに継承させたいメンバーのすべてを移動することで、問題を解決しました。ユーザーに強制的に上書きさせたいメソッドは、abstractと宣言されています。具体的なExampleクラスをfinalと宣言することにより、methodThreeをオーバーライドしないで、それらがあなたの要求を回避し、Exampleをサブクラス化するのを防ぎます。

関連する問題