2015-01-15 2 views
0

Так что я смотрю на этих соответствующих классов (и подклассы) ...Что такое (есть?) Цель, заключающаяся в объявлении метода дважды, когда родительский класс не изменяет никаких свойств?

public class Control{ 
    public Control(){} 
    public Control(String name, String type, ContainerControl owner){ 
     //do stuff here 
    } 
} 


public class ContainerControl extends Control{ 
    public ContainerControl() { super(); } 
    public ContainerControl(String name, String type, ContainerControl owner) 
    { 
     super(name, type, owner); 
     controls = new Controls(); //exists somewhere else 
    } 
} 

public class SSTab extends ContainerControl{ 
    public SSTab(){ super(); } 
    public SSTab(String name, String value, ContainerControl owner) 
    { 
     super(name, value, owner); 
    } 
} 

Я смущен о цели позади объявлений метода без параметров, которые используют супер(). Из проведенных мной исследований я был бы склонен полагать, что они необходимы для перегрузки методов свойствами из соответствующих родительских классов или переопределения. Тем не менее, поскольку они называют super(), который, по моему мнению, найдет метод с параметром в суперклассе (который снова делает то же самое), я не вижу, что действительно может измениться.

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

Любая помощь или ссылки будут невероятно оценены!


Развейте вопрос:

Почему не SSTab просто быть инициализирована с параметрами с CControl, которые могут быть инициализированы с параметрами с контролем? Я не вижу, как переменные конструктора без параметров необходимы для инициализации типов объектов, когда есть переменные-конструкторы с параметрами, которые в любом случае называют super.

+3

Конструкторы - это не объявления методов. –

ответ

3

Это перегрузка конструктора; конструктор не является методом.

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

SSTab - объект ContainerControl; поэтому, чтобы сделать SSTab, вам сначала нужно создать ContainerControl. Однако объект CControl IS A Control. Поэтому вы должны сначала создать объект управления. Например, вы родились, потому что родились ваши родители. Они родились, потому что родились родители THIER.

Развейте ответ:

Что я могу сказать (основано на моем понимании вашего вопроса) является то, что это вроде как, как есть определенные законы, чтобы следовать. Например, в реальной жизни, если у вас нет адвоката, вам будет предоставлен вам.Если вы вызываете SSTab (param x, y z), и вы не вызываете суперфункцию (с параметрами x y z), тогда вам будет предоставлен по умолчанию (который создаст пустой CControl и пустой элемент управления). Поскольку вы не определили внутри SSTab для использования другого, он будет использовать значение по умолчанию, и это не всегда то, что вы хотите сделать.

+0

Да, я случайно взял это из примера кода, но эта аналогия имеет смысл, спасибо! – HavelTheGreat

+0

Извините, небольшой вопрос, почему SSTab не может быть инициализирован параметрами с CControl, которые могут быть инициализированы параметрами с помощью Control? Я понимаю, что вы имеете в виду для создания объектов заранее, однако почему не являются конструкторами с параметрами, способными это сделать? Я снова запутался. – HavelTheGreat

+0

Я не понимаю ваш вопрос. Я могу сказать, что это похоже на то, как есть определенные законы. Например, в реальной жизни, если у вас нет адвоката, вам будет предоставлен вам. Если вы вызываете SSTab (param x, y z), и вы не вызываете суперфункцию (с параметрами x y z), тогда вам будет предоставлен по умолчанию (который создаст пустой CControl и пустой элемент управления). Поскольку вы не определили внутри SSTab для использования другого, он будет использовать значение по умолчанию, и это не всегда то, что вы хотите сделать. – Aify

1

Это пример перегрузки конструктора - так как это не методы.

Перегрузка конструктора таким образом позволяет вам создать объект, который не был инициализирован, и объект Control, которому было предоставлено имя.

Я бы предположил, что каждый класс также предоставляет общедоступные методы для установки обязательных полей, но это не показано в примере кода в вопросе (понятно, ИМО).

Кроме того, иногда при загрузке объектов через Reflection полезно иметь конструкторы без параметров (хотя вы можете вызвать конструктор с параметрами, используя Reflection).

+0

Это объясняет мое замешательство. Благодаря! – HavelTheGreat