2016-07-06 10 views
0

私は子クラスによって拡張された親クラスTableを持っています。Javaの親アクセス静的変数の子

親クラス:

abstract class Table{ 

    public static String getFullTable(){ 
     return child.DBTABLE + '.' + child.DBNAME; 
    } 

} 

サンプルテーブル

class User extends Table{ 
    public static final String DBTABLE = "user"; 
    public static final String DBNAME = "test"; 
} 

User.getFullTable()を呼び出すとき、私は値test.userを取得します。

これはできますか?

+5

スーパークラスをそのサブクラスに依存させることは絶対に避けてください。 –

+2

子レベルでデータによって定義されたこの動作が必要な場合は、メソッドを抽象的にして、子クラスに実装させます。 – azurefrog

+0

私はこれを避けようとしていましたが、あなたが言ったことをしなければならないように見えます。 –

答えて

-1

これはできません。まずDBTABLEもDBNAMEも抽象クラスのスコープ内には表示されません。それはそれがそうであるようにコンパイルされません。

+0

この回答は正しいとは限りません。スーパークラスは 'User.DBTABLE'を使用できます。もちろん、パブリックメンバー変数は、型が可視であればクライアントに表示されます。 OPはパッケージプライベートアクセスを使用してサンプルクラスを宣言しました。つまり、2つのクラスが同じパッケージ内にある必要がありますが、変数が表示されないと主張する根拠はありません。コードは正しくありませんが、変数は型のアクセス制約内で表示されます。 –

+0

私の答えは質問の記載方法に基づいて非常に正しいです。彼はサブクラスの静的変数をサブクラス名で参照していません。彼はスーパークラスレベルで宣言された変数であると私が推測した "子"を使用しています。私の投稿をダウングレードするのではなく、質問をダウングレードすることです。 –

1

は、次のような、子クラスから情報を要求する抽象メソッドを追加します。

abstract class Table{ 

    protected abstract String getDBTable(); 
    protected abstract String getDBName() 

    public String getFullTable(){ 
     return getDBTable() + '.' + getDBName(); 
    } 

} 

class User extends Table{ 
    public static final String DBTABLE = "user"; 
    public static final String DBNAME = "test"; 

    protected String getDBTable() { 
     return DBTABLE; 
    } 

    protected String getDBName() { 
     return DBNAME; 
    } 
} 

それは私は非静的であることをgetFullTable()を変更したことは注目に値します。抽象クラスに静的メソッドを持たせることは、それがどのサブクラスであるかに依存することを意図したものであり、実際には意味をなさない。

関連する問題