Java - Можете ли вы переопределить класс без вызова конструктора родительского класса? - PullRequest
2 голосов
/ 31 января 2012

У меня есть такой класс:

public class BaseClass
{
  public BaseClass(URL url, String something, String whatever)
  {
    // Do some stuff with URL, something and whatever
  }

  public List ImportantFunction()
  {
    // Some important stuff here
  }
}

Я хочу использовать этот класс, однако я хочу делать разные вещи в конструкторе.То, что делает конструктор, мне нужно сделать по-другому.Но я хочу использовать все функциональные возможности других методов класса.

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

super(url, something, whatever);

Можно ли расширить базовый класс, но иметь совершенно другой конструктор?Я не хочу, чтобы конструктор BaseClass вызывался вообще ...

Ответы [ 4 ]

8 голосов
/ 31 января 2012

Вы должны вызвать конструктор суперкласса.Если вы не вызовете его явно, Java попытается вызвать конструктор без аргументов автоматически;если такого нет, вы получите ошибку компиляции.Вызываемый конструктор не обязательно должен соответствовать аргументам, передаваемым конструктору подкласса.

Это обязательно - переменные-члены объектов могут быть инициализированы в конструкторе, и не вызов одного из них может нарушить суперклассвнутренние предположения.

Нет никакого способа избежать использования JNI для разрушения JVM.

2 голосов
/ 31 января 2012

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

public BaseClass(){ }

Затем при расширении этот конструктор будет вызываться по умолчанию первым. Только тогда будет вызван конструктор в вашем подклассе.

0 голосов
/ 31 января 2012

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

  1. Переместите весь код конструктора в защищенный метод в BaseClass, скажем что-то вроде protected void init(URL url, String something, String whatever){\\constructor code}
  2. Вызовите этот метод из конструктора

    public BaseClass (URL-адрес, строка с чем-либо, строка с чем угодно) { init (URL-адрес, String что-то, String что угодно); }

  3. Переопределить этот защищенный метод в подклассе.

0 голосов
/ 31 января 2012

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

public class ChildClass extends BaseClass {
    public ChildClass(URL url, String something, String whatever) {
        // implicit call to the Parent's default constructor if next line is commented
        super(); // explicit call to the default constructor of ParentClass

        // now do stuff totally specific to your ChildClass here
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...