On Java Packages: In a package where each class has its own .java file, is it possible to initialize a public Parent class object with a package-restricted child class object outside their package? To-wit: Can I make a method in Parent that initializes itself with the hidden child instance?
I know "this. new Child()" works but only if child is an inner class. I am trying to really practice proper object encapsulation so I want the child classes to remain hidden from anyone outside its package.
Edit: To further clarify my question I've added initWithAnyChild() in Parent class and a child class ChildB().
For Instance:
package righthere;//Parent.java
public class Parent{
public Parent(){}
public void initWithChildA(){ this.new ChildA(); }
public Parent initWithAnyChild(/*An identifier*/){
switch(/*identifier*/){
case /*ChildA*/: return new ChildA();
case /*ChildB*/: return new ChildB();
default: break;
}
return null;
}
}
/ *** /
package righthere;//ChildA.java
class ChildA extends Parent{
//Implementation;
}
/ *** /
package righthere;//ChildB.java
class ChildB extends Parent{
//Implementation;
}
/ *** /
package somewhere;//Test.java
import righthere.*;
public class Test{
Parent var1.initWithChildA(); //Would not work since ChildA is not an inner class.
Parent var2 = var2.initWithAnyChild(/*ChildA*/)//Would this work?
}
/*Is initWithAnyChild() the better way to go about this? Or is there
*an easier way?
*/
Вы не можете заставить new
возвращать что-либо, кроме класса, который вы назвали. Подойдет ли заводской метод? Это может вернуть любой допустимый тип возврата.
@ScaryWombat Разве это не противоречит некоторым нормам программирования?
@markspace К вашему первому вопросу: нет, каждый дочерний класс находится в собственном файле .java, но пакет скрыт. К вашему второму: может быть, фабричный метод будет работать, но я пытаюсь понять, есть ли способ использовать «новый» или какую-то простую форму инициализации.
Итак, вам нужны конструкторы package-private
?
Дочерние конструкторы уже являются частными для пакета, как и классы. Я хотел бы иметь доступ к их методам через наследование в каком-то другом пакете с помощью родительской переменной. Проблема заключалась в создании экземпляра общедоступной родительской переменной с частным дочерним классом пакета (которые находятся в том же пакете) вне этого пакета.
Чтобы ответить на мой вопрос:
Используя мой пример, метод в родительском классе "initWithAnyChild (/ Идентификатор /)" работает, где я могу получить частные подклассы пакета и сохранить его в общедоступной переменной родительского класса (полиморфизм) и иметь возможность использовать его за пределами своего упаковка.
Может быть, мой вопрос был слишком запутанным, чтобы понять, или я был недостаточно ясен? Приношу свои извинения, это мой первый пост здесь.
Вы пытаетесь создать внутренний класс?
ChildA
должен входить в определениеParent
.