Подтвердить что ты не робот

Какова хрупкая проблема базового класса?

Какова проблема хрупкого базового класса в java?

4b9b3361

Ответ 1

Хрупкий базовый класс является общей проблемой с наследованием, которая применяется к Java и любому другому языку, который поддерживает наследование.

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

Существует несколько способов смягчения этого; но нет простого метода, чтобы полностью избежать его, продолжая использовать наследование. Вы можете запретить другим классам, наследующим класс, помечать объявление класса как final в Java.

Лучшая практика, чтобы избежать худших из этих проблем, - обозначить все классы как окончательные, если вы специально не намереваетесь наследовать их. Для тех, кто намерен наследовать, спроектируйте их так, как если бы вы разрабатывали API: скрыть все детали реализации; быть строгим в отношении того, что вы испускаете, и внимательно относиться к тому, что вы принимаете, и подробно документировать ожидаемое поведение класса.

Ответ 2

Базовый класс называется хрупким, когда изменения, внесенные в него, разбивают производный класс.

class Base{
    protected int x;
    protected void m(){
       x++;
    }

    protected void n(){
      x++;      // <- defect 
      m();
     }
 }


class Sub extends Base{
        protected void m(){
            n();
        }
    }

Ответ 4

Все, что сказал "Колин Пикард", является правдой, и здесь я хочу добавить некоторые из лучших практик, чтобы быть более защищенными, когда вы пишете код, который может вызвать проблемы такого рода на языке Java, особенно если вы создаете среду или библиотека...

  1. Сделайте все ваши конкретные классы окончательными по умолчанию, потому что вы, возможно, не захотите, чтобы они были унаследованы. Вы нашли такой тип поведения таким же характерным для многих языков, как язык Котлина (если вам нужно его расширить, тогда все в порядке, удалите ключевое слово final, так что может помочь читателю вашего кода).
  2. Для абстрактных классов сделайте все свои реализованные методы окончательными, чтобы их подклассы не модифицировались (вообще говоря, даже защищенные методы - плохая идея, подклассы не должны так много знать о своих подклассах), не раскрывайте ваш метод, если они не предназначены для быть переопределенным...
  3. Старайтесь не использовать Relationshiphip [is], вместо этого попробуйте использовать [Использовать] отношения между вашими диаграммами классов, используйте интерфейсы, чтобы избежать проблем расширения.
  4. Помните, что каждое расширение может быть заменено на орудия, и если вам нужно сделать реализацию по умолчанию, то здесь код spinet:

public interface MyBehavior {
    void doAction();

    static class Implementation implements MyBehavior {
        public void doAction() {
            //do some stuff
        }
    }
}

//  instead of doing extends To a class that have the doAction method
//  we will make a [use a] relationShip between the Example class & the Implementation class
public class Example {
    private MyBehavior.Implementation helper = new MyBehavior.Implementation();

    public void doAction() {
        this.helper.doAction();
    }
}