14

誰かが拒否された遺贈の意味を説明してもらえますか? 私はいくつかの記事を読んでみましたが、それは一種のコードの匂いであるか、wiki では、基本クラスのコントラクトが派生クラスによって尊重されないように、基本クラスのメソッドをオーバーライドするクラスであることがわかります。

しかし、一言で言えば、またはより簡単な言葉で言えば、それは実際には何ですか?

4

1 に答える 1

22

わかると思います。拒否された遺産はコードの匂いです。しかし、どのような種類のコードの匂いがしますか? Martin Fowler の著書Refactoring: Improvement the design of existing codeを引用します。

サブクラスは、親のメソッドとデータを継承します。しかし、彼らが与えられたものを望んでいない、または必要としていない場合はどうなりますか? 彼らはこれらすべての素晴らしい贈り物を与えられ、遊ぶためにほんのいくつかを選びます.

親クラスから継承するサブクラスがありますが、サブクラスは親クラスによって提供されるすべての動作を必要としません。そのため、サブクラスは親クラスの一部の動作 ( bequest ) を拒否します。だからこそのコード臭です。

@catzilla のコメントへの回答を更新します

この本を読む機会がない場合 (私はそれを強くお勧めします)、少なくともSourceMaking のページで十分に説明されています。

コード例について、試してみましょう。人の税金を計算するためのクラスがいくつかあるとしましょう。政府の税金を計算するクラスを作成できます。

class Government {
    protected double computeBaseTax() { //... }

    protected double addPersonalTax(double tax) { //... }

    public double getTax() {
        double tax = computeBaseTax();
        return addPersonalTax(tax);
    }
}

次に、会社が税金として支払わなければならない金額を計算するクラスを作成できます。何らかの理由で、このクラスはaddPersonalTaxメソッドを再利用できますが、再利用できないことに気付きましたcomputeBaseTax()。そして悪い決断を下して、私たちのCompanyクラスは から継承することにしましGovernmentた。

class Company extends Government {
    private double computeInitialTax() { //... }

    @Override 
    public double getTax() {
        double tax = computeInitialTax();
        return addPersonalTax(tax);
    }
}

わかりました、問題はより良い方法 (メソッドのオーバーライド) で解決できますが、拒否された遺贈は、基本クラスから継承し、提供された一部の機能が拒否されたときに発生するコードの匂いであることcomputeBaseTax()を説明しようとしています。

于 2015-03-11T15:39:21.547 に答える