起動時にサブクラスのメソッドを呼び出すしない方法はありますか?

テイラーVerikor:

私はJavaで私自身のデータベースプログラムを作成したいです。私は解決策がそこsyliteなどのように、すでに存在していることを知っているが、私はそれを自分でやってみたいです。それは最初に予想以上に複雑なプログラムであることが判明したように、私は概要を保つために相続の多くを使用しました。例えば:

  • 最初のクラスは、RawStreamManager使用してファイルへのストリームを処理するために、FileOutputStream
  • 第二のクラスは、SessionManagerCSMA / CDの戦略のいくつかの種類を使用して、複数のアクセスを防止するために、
  • 他のことを行うにはいくつかのより多くのクラスがあります。

私の問題は今、しかし、ということであるSessionManager使用することになりread()、私はメソッドなどを呼び出すときに、代わりに独自のの、サブクラスのメソッドをread()クライアントが権限を持っており、クライアントが読むために(手当をトークンがない場合、データベースに文字列を分割するために、私は、そのための十分な理由があると思いますが、私の場合、それは数字にも意味がありませんから天気/複数のアクセスなし書き込み)。コールする方法を探して-私はそうread()する方法SessionManagerの代わりにサブクラスの(私はそれを必要とすることになるため、さらにいくつかの例がある)read()メソッドを

私はすでに手動でキャストしようとしたSessionManagerSessionManager呼び出す前に、オブジェクトread()が、それは助けにはなりませんでした。回避策の種類は、これらのメソッドに別の名前を与えることである可能性があります。

ここに私の穴データベース・コードを落とすことなく君たちいくつかのコードを表示するために、私は問題を単純化:

public class First {
    public First() {
        System.out.println("syso from first:");
        ((First) this).print();
    }

    public void print() {
        System.out.println("FIRST");
    }
}
public class Second extends First{
    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        System.out.println("syso from second:");
        print();
    }

    @Override
    public void print() {
        super.print();
        System.out.println("SECOND");
    }
}

今私は、出力があることを期待します:

syso from first:
FIRST
syso from second:
FIRST
SECOND

それは(3行目)です。

syso from first:
FIRST
SECOND
syso from second:
FIRST
SECOND

だから、その問題のためのUAのソリューションのいずれかをしてください持っていますか?前もって感謝します。

全おかげでガイ:

あなたがのインスタンス作成しているので、Secondクラスのコンストラクタとき、SecondISは、スーパークラスのコンストラクタにコールを呼び出したFirst()暗黙的の暗黙の呼び出しに訴える呼び出されるsuper()Second()コール。

あなたはタイプを持っているが、キャストthisFirstするオーバーライドされたメソッドInvokeまだそれになるSecond原因の性質上、クラスの動的/ランタイム多型のJavaインチ 実行時には、JVMは、インスタンスをチェックしていない参照のそのメソッドを呼び出します。

あなたは、印刷方法の静的を作るか、または全く異なるメソッド名を使用する必要が予想される出力を回避し、与えるために:

class First {
    public First() {
        System.out.println("syso from first:");
        First.print();
    }

    public static void print() {
        System.out.println("FIRST");
    }
}
 class Second extends First{
    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        System.out.println("syso from second:");
        Second.print();
    }


    public static void print() {
        First.print();
        System.out.println("SECOND");
    }
}

出力:

syso from first:
FIRST
syso from second:
FIRST
SECOND

静的バージョンは、静的の場合の方法として期待される出力を与える属するクラスではなくインスタンスに。このクラスではSecond私がしている隠されたとオーバーライドされないprint()基本クラスのをFirst

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=331801&siteId=1