Как полностью скрыть метод суперкласса в Java

Недавно я подумываю о создании собственной библиотеки Date. И здесь я нахожу проблему, вот она:

Как скрыть метод суперкласса в подклассе? Поэтому он не будет обнаружен в подклассе.

Пример: У меня есть класс, который распространяется на Date и другой класс, который распространяется на предыдущий класс. В моем новом подклассе он обнаруживает все методы из Date, например getDate и т.д. Я хочу, чтобы в моем подклассе все методы из Даты не были обнаружены, а не бросали исключение, но полностью не обнаружено.

Заранее спасибо:)

Ответ 1

Благодарите композицию над наследством здесь.

Вместо того, чтобы наследовать Дату, это как поле участника внутри вашего класса MyDate.

public class MyDate {
    private Date dt = new Date();

    // no getDate() available

    public long getTime() {
        return date.getTime();
    }
}

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

Ответ 2

Вы не можете скрыть его, если он расширен, но вы можете переопределить.

если вы хотите, чтобы ваш пользователь API не использовал метод, я предлагаю переопределить и просто выброшу это исключение:

UnsupportedOperationException

но, глядя на то, что вы написали, вам следует рассмотреть возможность создания поля Date в вашем классе, а не расширения класса.

Ответ 3

Невозможно.

Если то, что вы хотите, возможно, тогда наследование будет нарушено. Внезапно, когда вы используете определенный тип IS-A Date, вы не сможете вызвать какие-либо методы типа Date. Это неправильно на нескольких уровнях. Например, он нарушает Принцип замены Лискова.

Ответ 4

вместо этого вы можете использовать делегирование

public class NewDate{
  Date d;
  NewDate(){
     d = new Date();
  }

  methodsYouWantToChange(){
     // new implementation
  }


  methodsYouDontWantToChange(){
     d.methodsYouDontWantToChange();
  }


  newMethods(){
     // new implementation
  }
}

Ответ 5

Переопределите метод и сделайте его статическим, он скроет метод суперкласса