Наследование и экземпляры Java

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?
  */

Вы пытаетесь создать внутренний класс? ChildA должен входить в определение Parent.

markspace 30.10.2018 05:52

Вы не можете заставить new возвращать что-либо, кроме класса, который вы назвали. Подойдет ли заводской метод? Это может вернуть любой допустимый тип возврата.

markspace 30.10.2018 05:54

@ScaryWombat Разве это не противоречит некоторым нормам программирования?

Franc_ 30.10.2018 06:03

@markspace К вашему первому вопросу: нет, каждый дочерний класс находится в собственном файле .java, но пакет скрыт. К вашему второму: может быть, фабричный метод будет работать, но я пытаюсь понять, есть ли способ использовать «новый» или какую-то простую форму инициализации.

Franc_ 30.10.2018 06:03

Итак, вам нужны конструкторы package-private?

Scary Wombat 30.10.2018 06:10

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

Franc_ 30.10.2018 07:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
47
1

Ответы 1

Чтобы ответить на мой вопрос:

Используя мой пример, метод в родительском классе "initWithAnyChild (/ Идентификатор /)" работает, где я могу получить частные подклассы пакета и сохранить его в общедоступной переменной родительского класса (полиморфизм) и иметь возможность использовать его за пределами своего упаковка.

Может быть, мой вопрос был слишком запутанным, чтобы понять, или я был недостаточно ясен? Приношу свои извинения, это мой первый пост здесь.

Другие вопросы по теме