4
public class SuperClass {
    public void doFoo() {
        //...
    }
}

public class SubClass extends SuperClass implements AnInterface {}

public interface AnInterface {
    public abstract void doFoo();
}

メソッドSubClassを実装する必要がないのはなぜですか?doFoo()すでにスーパークラスにあるからだと思います。しかし、 のメソッドに@Overridefor を追加できません。だから陰になってる?またはそれは何と呼ばれていますか?そして、これは良い/通常の習慣ですか?doFoo()SuperClass

4

3 に答える 3

1

SubClass が doFoo() メソッドを実装する必要がないのはなぜですか?

ですでに実装されているためSuperClassです。

しかし、SuperClass の doFoo() メソッドに @Override を追加できません。

SuperClassいいえ、実装していないため、できませんAnInterface。誰もメソッドをオーバーライドしません。

だから陰になってる?

いいえ、シャドーイングは別のものです。それは変数に関するものです。したがって、変数があり、同じ名前の変数を定義しようとすると、シャドウイングSuperClassになります。これには名前がありません。fooSubClass

そして、これは良い/通常の習慣ですか?

これは通常の練習です。多くの大きなプロジェクトで何度も見てきました。



TLDR の例は次のとおりです。

を実装するために必要なインターフェイスがあるとしましょうModelBasedWizard(ウィザードは多くのデスクトップ アプリで一般的なものです)。

public interface IModelBasedWizard {

    public void addWizardPage(IWizardPage page);

    public IStatus getWizardStatus();

    public void bindModel(IModel model);
}

ウィザードの実装がすでにあるとしましょう

public class Wizard {

    public void addWizardPage(IWizardPage page) {
        pages.add(page);
        page.createContent(this);
    }

    public IStatus getWizardStatus() {
        List<IStatus> stati= new ArrayList<Status>();
        for (IWizardPage page : pages) {
            stati.add(page.getStatus());
        }
        return stati;
    }
}

これはウィザードの視覚的な部分にすぎませんが、モデルについては何も知りません。オッケー、問題ないよ:

public class ModelBasedWizard extends Wizard implements IModelBasedWizard {
    //UI, pages, stati and all other functionalities are already implemented.
    //I just need to bind this wizard to a model

    //create some content here

    @Override
    public void bindModel(IModel model) {
        this.model = model;
        this.fieldOne.bindToModel(model);
        model.addPropertyChangeListener(new PropertyChangeListener() {
            //bla bla
        });
    }
}
于 2013-06-26T14:55:52.467 に答える
0

これがインターフェースの使用方法です。インターフェイスを実装する場合、クラスに関するすべての変更点は、そのインターフェイスによって定義されたクラスにメソッドが必要になることです。

コードを機能させるために必要なことはdoFoo()、サブクラスで呼び出される空のメソッドを配置することだけです。

于 2013-06-26T14:55:08.000 に答える