Думаю, вы поняли. 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 что Отказался завещанию это код запах, который происходит, когда мы наследуем от базового класса и некоторые предоставляется функциональность.
Если вы были бы добры, не могли бы вы рассказать о «отказе от желания» больше .. как некоторые простые примеры практического кода или некоторые аллегории, которые могут просветить меня, чтобы я мог понять это наизусть? Я действительно хочу практиковать лучшие принципы кодирования. – catzilla
Я добавил ссылку, где более подробное объяснение того, что ** Refused Bequest ** является добавленным примером кода. Надеюсь, это поможет вам лучше понять проблему. – rchavarria
ваш дополнительный ответ сделал мой обзор восприятия относительно отказа от участия в задании намного яснее сейчас .. поэтому это означает, что есть ненужные методы, которые включены в наследование, и это делает запах кода .. ну, я думаю, это самое простое объяснение, которое я могу понять. хорошо, я собираюсь прочитать ваши предлагаемые ссылки и надеюсь, что я смогу узнать много других вещей .. Вы заслужили мой голос .. :) спасибо за ответ! – catzilla