Принуждение подклассов моего класса переопределять только определенные функции в Java - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть класс, скажем,

public class GeneralClass<T> {
    methodA() {...}
    methodB() {...}
    methodC() {...}
}

, и я наследую этот класс

public class MoreSpecificClassString extends GeneralClass<String> {
    methodD() {...}
    methodE() {...}
    methodF() {...}
}

public class MoreSpecificClassInt extends GeneralClass<Integer> {
    methodX() {...}
    methodY() {...}
    methodZ() {...}
}

Теперь, что я хотел бы знать, возможно ли форсироватьподклассы GeneralClass для переопределения только одного метода, например methodA?

Спасибо

Ответы [ 4 ]

5 голосов
/ 15 ноября 2011

Да.Сделайте methodA абстрактный и сделайте GeneralClass абстрактный класс.Если вы хотите запретить переопределение methodB и methodC, пометьте их как final.

Редактировать

Если, с другой стороны, вы хотите обеспечить реализацию по умолчанию дляmethodA и также требуют подклассов для его переопределения, вы существенно нарушаете принцип подстановки Лискова .Вы должны пересмотреть, почему вам нужен этот дизайн, потому что он пахнет довольно плохо.Например, было бы абсолютно ничто , препятствующее вашему подклассу просто переопределить ваш метод следующим образом:

@Override
public void methodA() {
    super.methodA();
}

И если повторная реализация может просто вызвать реализацию класса по умолчанию суперкласса,какой смысл заставлять его переопределять в первую очередь?

По этой причине (помимо прочего) невозможно обеспечить реализацию по умолчанию и требуют подклассов для ее переопределения.Переосмыслите свой дизайн.

3 голосов
/ 15 ноября 2011

Да, сделать GeneralClass абстрактный класс с реализациями для других методов.

Пример:

abstract class ABC {
  abstract int methodA();
  final int methodB() { ... implementation ...}
}
0 голосов
/ 15 ноября 2011

У вас есть несколько доступных инструментов:

  1. Вы можете объявить метод (и базовый класс) abstract.Конкретные классы будут вынуждены реализовать метод.
  2. Объявить не переопределяемые методы final.Производные классы не могут переопределять эти методы.
  3. Объедините 1 и 2: объявите метод final и попросите его делегировать часть своей работы абстрактному методу.(Этот шаблон часто используется с пустым методом вместо абстрактного метода для реализации так называемых «зацепок» в иным образом фиксированной логике.)
0 голосов
/ 15 ноября 2011

Для форсирования только одного - сделайте этот метод abstract?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...