0

SuperClass を拡張して IClass を実装するクラス (簡単にするために SubClass と呼びます) があります。super.method() を使用して SuperClass のメソッドを呼び出すことができることは知っていますが、IClass から実装されている SubClass からメソッドを呼び出すことは可能ですか?

例:

public class SuperClass {

    public void method(){

        implementedMethod();

    }

}

サブクラス:

public class SubClass extends SuperClass implements IClass{

    public void implementedMethod() {

        System.out.println("Hello World");

    }

}

クラス:

public interface IClass {

    public void implementedMethod();

}

SuperClass から SubClass の implementedMethod() (IClass から取得) を呼び出したい

どうすればそれを行うことができますか?

4

3 に答える 3

2

スーパークラスを抽象化できます。

public abstract class SuperClass implements IClass {
    public void method(){
        implementedMethod();
    }
}
于 2013-07-25T19:47:19.630 に答える
1

そのメソッドを呼び出す唯一の方法は、タイプ SubClass のオブジェクトを (SuperClass で) 作成し、subClassInstance.implementedMethod() を呼び出すことです。

また、これは非常に洗練されていないことも強調したいと思います。質問に対するコメントで述べたように、スーパークラスがサブクラス メソッドを呼び出す必要がある場合は、クラスの設計を再検討する必要があります。

于 2013-07-25T19:36:23.350 に答える
1

上記のタイプを考えると、anExpressionOfTypeSubClassOrIClass.implementedMethod()使用する必要があります。式のType (それが提供するビュー)には、使用するメソッドが含まれている必要があることに注意してください。この場合、SuperClass 型の式は、宣言されたimplementedMethodメンバーがないため、ここでは使用できません。

アプローチの 1 つ (おそらく推奨されるアプローチ) は、抽象メソッドを使用することです。抽象メソッドはポリモーフィズムに厳密には必要ありませんが、サブクラスが実装を提供する必要があるこのようなシナリオを説明しています。(抽象メソッドは、サブクラスでオーバーライドされることを期待しているが必須ではない空のメソッドに置き換えることができますがabstract、設計された目的のために使用しないのはなぜですか?)

abstract class SuperClass implements IClass {
    // Don't implement this, but declare it abstract
    // so that we can conform to IClass as well
    public abstract void implementedMethod();

    public void method () {
       // Now this object (which conforms to IClass) has implementedMethod
       // which will be implemented by a concrete subclass.
       implementedMethod();
    }
}

これには、SuperClass を直接インスタンス化できない (結局のところ抽象的である) という「否定的な」側面があり、SuperClass は期待される署名を実装する (または、示されているように、abstract を介してデリゲートする) 必要があります。この場合、SuperClass とすべてのサブクラスを IClass として表示できることが保証されるため、厳密には必須ではありませんが、SuperClass に IClass を実装することも選択しました。

または、式のタイプはオブジェクトの単なるビューであり、オブジェクトの実際の具体的なタイプと必ずしも同じではないことに注意してください。次のコードを使用すると型安全性が失われるため、使用しないことをお勧めしますが、重要な点を示していると思います。

class SuperClass {
    public void method () {
        // We try to cast and NARROW the type to a
        // specific "view". This can fail which is one
        // reason why it's not usually appropriate.
        ((IClass)this).implementedMethod();
    }
}

class SubClass extends SuperClass implements IClass {
  // ..
}

class BrokenSubClass extends SuperClass () {
}

// OK! Although it is the SAME OBJECT, the SuperClass
// method can "view" the current instance (this) as an IClass
// because SubClass implements IClass. This view must be
// explicitly request through a cast because SuperClass itself
// does not implement IClass or have a suitable method to override.
(new SubClass()).method();

// BAD! ClassCastException, BrokenSubClass cannot be "viewed" as IClass!
// But we didn't know until runtime due to lost type-safety.
(new BrokenSubClass()).method();
于 2013-07-25T20:11:39.613 に答える