2017-10-19 9 views
-2

彼女が呼び出されるクラスに従って定数を使用するメソッドを使いたいと思います。 この悪い説明のために申し訳ありませんが、ここでは一例です:クラスの拡張で静的な値を使用する

public class Mom{ 
    public void execute(parameters){ 
     // Some actions 
     String nf = String.format(C_CARS) 
    } 
} 

public class Son1 extends Mom{ 
    private static final String C_CARS=" myFormat " 
} 


public class Son2 extends Mom{ 
    private static final String C_CARS=" myFormat2 " 
} 

public static void main(String[] args){ 
    Son1 son1=new Son1(); 
    Son2 son2=new Son2(); 
    son1().execute(myparameters); 
    son2().execute(myparameters); 
} 

私はそのような何かをしたいと思い、方法はありますか?ここでの問題は、C_CARSがMomクラスでは不明であることです。

+0

MomクラスはSon1クラスとSon2クラスのスーパークラスです。したがって、スーパークラスではサブクラス変数にアクセスできません。 – Karan

+0

Javaフィールドが多態的に働いたとしても、これは 'Son3 extends Mom {/ * no constant * /}'のためにどのように動作すると思いますか? –

+0

Son1クラスとSon2クラスの両方で 'execute'メソッドを上書きします。 – Karan

答えて

2

これは、継承は、Javaでどのように機能するかだけではありません。

Momのすべてのインスタンスに値があることを保証する必要があります。インスタンスメソッド(例:

public abstract class Mom{ 
    public void execute(parameters){ 
    String nf = String.format(getCCars()); 
    } 
    protected abstract String getCCars(); 
} 

そして、子クラスで実装します。あなたのオブジェクト指向設計で何かあり

class Son1 extends Mom { 
    @Override protected String getCCars() { 
    return "something"; 
    } 
} 

覚えておいてください:Son1クラスのすべてのインスタンスもMomのインスタンスです。しかし現実の世界では、ほとんどの息子は母親ではありません。

extendsここで使用するのは適切ではありません。

0

このように変数を上書きすることはできません。代わりの方法を使用します。

abstract public class Mom { 
    abstract protected String cCars(); 

    public void execute(parameters){ 
     // Some actions 
     String nf = String.format(cCars()) 
    } 
} 

public class Son1 extends Mom{ 
    private static final String C_CARS=" myFormat "; 

    @Override 
    protected String cCars() { 
     return C_CARS; 
    } 
} 

また、あなたがMomでデフォルトの実装を提供することができ、その後、クラスやメソッド、抽象をする必要はありません。

0

staticを使用しないと、問題が発生します。

public class Mom { 
    private final String cCars; 
    protected Mom(String cCars) { 
     this.cCars = cCars; 
    } 
    public void execute(parameters){ 
     // Some actions 
     String nf = String.format(cCars) 
    } 
} 

public class Son1 extends Mom { 
    public Son1() { 
     super(" myFormat "); 
    } 
} 


public class Son2 extends Mom { 
    public Son2() { 
     super(" myFormat2 "); 
    } 
} 
0

スーパークラスがそのサブクラスのメンバーにアクセスできないため、これは機能しません。また、メソッドをオーバーライドできるように、変数をオーバーライドすることもできません。代わりに次のコードで試してみてください。

public static abstract class Mom { 
    public void execute() { 
     System.out.println(getCCars()); 
    } 

    abstract String getCCars(); 
} 

public static class Son1 extends Mom { 

    @Override 
    String getCCars() { 
     return " myFormat "; 
    } 
} 

public static class Son2 extends Mom { 

    @Override 
    String getCCars() { 
     return " myFormat2 "; 
    } 
} 

public static void main(String[] args) { 
    Son1 son1 = new Son1(); 
    Son2 son2 = new Son2(); 
    son1.execute(); 
    son2.execute(); 
} 

これはJavaでのやり方です。

私は上記のコードをテストしました。それはコンパイルし、望ましい結果を生成します。

0

staticと記されたフィールドは、インスタンスではなくクラスに属します。また、C_CARSSon1は、C_CARSSon2にはまったく関係ありません。そのようなことを達成するための

  • 方法がこれです:

    class Mom { 
        public abstract String getCCars(); 
    } 
    

    その後Momの各優勢はgetCCars()メソッドをオーバーライドする必要があります。

  • コンストラクタMomに文字列cCarsを使用することもできます。それぞれの優勢はその後Momで定義されたスーパーコンストラクタを呼び出す必要があります。

    class Mom { 
    
        final String cCars; 
    
        Mom(String cCars) { 
         this.cCars = cCars; 
        } 
    
        void execute(String parameters) { 
         System.out.println(this.cCars); 
        } 
    } 
    
    class Son1 { 
    
        Son1() { 
         super("MyFormat"); // We have to call the super constructor 
        } 
    } 
    
関連する問題