2015-02-02 4 views
7

Может ли кто-нибудь объяснить, что делает Отказ от ответственности означает? Я попытался прочитать некоторые статьи и сказать, что это своего рода запах кода или в wiki, он говорит, что это класс, который переопределяет метод базового класса таким образом, что контракт базового класса не удостаивается производным классом ,Что такое Отказанное Завещание?

Но в двух словах или в более простых терминах, что это на самом деле?

ответ

14

Думаю, вы поняли. Refused Bequest - это запах кода. Но, какой тип запаха кода? Котировка книги Мартина Фаулера Refactoring: improving the design of existing code:

Подклассы получают наследование методов и данных своих родителей. Но что делать, если они не хотят или не нуждаются в том, что им дают? Им дают все эти великие подарки и выбирают только несколько, чтобы играть.

У вас есть подкласс, который наследуется от родительского класса, но для подкласса не требуется все поведение, предоставляемое родительским классом. Из-за этого подкласс отклоняет какое-либо поведение (дознание) родительского класса. Вот почему это запах кода.

Update ответ @ catzilla Замечание:

Если вы не имеете возможности читать книгу (я полностью рекомендую), по крайней мере, у вас есть SourceMaking page, который описывает его довольно хорошо.

Пример кода, давайте попробуем. Представим себе, что у нас есть классы для расчета налогов человека. Мы могли бы иметь класс, который вычисляет государственные налоги:

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() метод), но я пытаюсь ilustrate что Отказался завещанию это код запах, который происходит, когда мы наследуем от базового класса и некоторые предоставляется функциональность.

+0

Если вы были бы добры, не могли бы вы рассказать о «отказе от желания» больше .. как некоторые простые примеры практического кода или некоторые аллегории, которые могут просветить меня, чтобы я мог понять это наизусть? Я действительно хочу практиковать лучшие принципы кодирования. – catzilla

+1

Я добавил ссылку, где более подробное объяснение того, что ** Refused Bequest ** является добавленным примером кода. Надеюсь, это поможет вам лучше понять проблему. – rchavarria

+1

ваш дополнительный ответ сделал мой обзор восприятия относительно отказа от участия в задании намного яснее сейчас .. поэтому это означает, что есть ненужные методы, которые включены в наследование, и это делает запах кода .. ну, я думаю, это самое простое объяснение, которое я могу понять. хорошо, я собираюсь прочитать ваши предлагаемые ссылки и надеюсь, что я смогу узнать много других вещей .. Вы заслужили мой голос .. :) спасибо за ответ! – catzilla