8

インターフェイスにコーディングしています。

インターフェイスAとそれを実装するクラスBがあります。

Cで拡張することでB の機能をオーバーライドできると言われましたが、 BにもCにも触れず、後でBを構成ファイルのAの実装クラスとしてCに置き換えるように求められました。

Aでは利用できないメソッドが必要だと思うので、 Cで実装できるメソッドをAに追加する必要があります。しかし、私はAに触れることはできません。

誰かがそれをどのように行うことができるかを手伝ってもらえますか?

ありがとう。

編集: コード例:

A.java

public interface A {
    void X();
    void Y();
}

B.java

public class B implements A {
    public void X() {//something interesting}
    public void Y() {//something not very interesting}
}

Aどちらにも触れることが許されなかったか、B別のクラスを作成Cして B から拡張しなければならなかったためです。

C.java

public class C extends B {
    public void Y() {//overriding B's not very interesting Y and making it interesting}
}

今、私 は自分のことを行うためvoid Z()C.javaに別のメソッドが必要ですが、参照変数を使用しているときにC.javaAだけにメソッドを追加するとインターフェイスにコーディングしているため、呼び出すことができないため、インターフェイスで次のように宣言する必要がありますそのように使用するのは良いことですが、そうすると、許可されていないものに触れなければなりません。したがって、この問題を解決する方法は、私が尋ねようとしてきたことです。A'sZ()void Z()AA

したがって、基本的に、次のようなことはできません。

A a = new C();
a.Z(); //can't do this

AやBに触れずにそのようなことを達成する方法はありますか?

4

6 に答える 6

8

私はあなたが何を望んでいるのか理解していると思います。あなたは以下を持っています:

public interface A {
  // can't touch this
}

public class B implements A {
  // can't touch this
}

public class C extends B {
  // you want to add your own method
  void someNewMethod();
}

// And you wish to do this:
A foo = new C();
foo.someNewMethod();

これがあなたが望むものであるならば、私はそれができないのではないかと心配しています。で作業する人は、 ;Aで定義されたメソッドについてのみ知っています。彼らはあなたがあなたのクラスでA定義したことを知りません。変更を許可する必要があります。someNewMethod()CA

extremisでは、次のインスタンスのクラスタイプを確認できることに注意してくださいA

A foo;
// ...

if (foo instanceof C) {
  ((C) foo).someNewMethod();
}

しかし、それは本当に醜く、オブジェクト指向プログラミングの基本的なルールの多くを破っています。

于 2012-09-08T08:47:18.960 に答える
1

これが許可されているかどうかはわかりませんが、クラスだけでなくインターフェイスも拡張できます。

public interface A2 extends A { public void mySuperVeryInterestingNewMethod(); }

于 2012-09-08T19:00:00.103 に答える
0

これはあなたの問題を解決するかもしれません:

package test;

public interface A {

    void X();
    void Y();

}


package test;

public class B implements A{

    @Override
    public void X() {

        System.out.println("Something X");

    }

    @Override
    public void Y() {

        System.out.println("Something Y");
    }



}

package test;

public class C extends B implements A{

    public static void main(String[] args) {

        A a=new C();
        a.X();
        a.Y();

    }

}

あなたの条件によって

1-インターフェース A を作成しました。

2-Aを実装するクラスBを作成しました。

3-B を拡張して A を実装するクラス C を作成しました。

4- a=new C() は型 A の参照変数を作成しますが、実行時には C のオブジェクトを保持します。

B と C に触れることはできないため、署名は同じであり、B を拡張するため、C のオブジェクトを使用して B から X() と Y() を呼び出しています。

したがって、C に X と Y を実装して B を変更せずに、B を C に置き換えたことになります。

出力:

Something X
Something Y

これがあなたの質問に答えることを願っています。

于 2016-09-30T11:35:16.077 に答える
0

あなたの質問はまったく明確ではありません。これはあなたが言いたいことですか、それともあなたが望んでいることですか?

public interface InterfaceA
{

}

public class ClassB implements InterfaceA
{

}

public class ClassC extends ClassB
{

}

public class ClassD extends ClassC
{

}

public class Main
{
    protected InterfaceA A;

    public Main()
    {
        //A = new ClassB();
        A = new ClassD();
    }


    public static void main(String[]args)
    {
    }
}
于 2012-09-08T06:49:28.350 に答える
0

メソッドがサポートされている場合は、それを実装するためにインターフェイスに追加する必要はありません。他の場所で使用される場合、B は別のインターフェース D を実装します。

于 2012-09-08T07:47:11.740 に答える
0

それで、あなたが今書いたことによると、A、B、または C に触れることはできません... では、C を D で拡張しますか?

次に、必要な/必要なメソッドを追加できます。

于 2012-09-08T06:07:55.773 に答える