Создание Java Класса, который может содержать одну переменную любого типа - PullRequest
1 голос
/ 23 февраля 2020

Я делаю класс сцены, для которого я хотел бы еще не определенный тип переменной.

class Scene {
 int fps = 60;
 float duration;
 // one instance of any variable type (another class)
}

, так как иногда я хотел бы, чтобы сцена создавалась с использованием :

class Scene {
 int fps = 60;
 float duration;
 Simulation1 simulation;
}

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

class Scene {
 int fps = 60;
 float duration;
 Simulation2 simulation;
}

Simulation1 и Simulation2 . очень разные пользовательские классы, но они имеют некоторые общие имена функций. Например, они оба имеют функции init (), deleteRandomParticles () и другие. Это означает, что в моем основном коде я могу позвонить:

scene.simulation.init();
scene.simulation.deleteRandomParticles();

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

full решение:

class Scene<T extends SceneInterface> {
 T simulation;

 Scene(T simulation) { 
  this.simulation = simulation; 
 }   
}

interface SceneInterface {
 public void init();
 public void deleteRandomParticles();
}

и убедитесь, что это есть в ваших классах симуляции:

class Simulation1 implements SceneInterface{
}

Ответы [ 2 ]

4 голосов
/ 23 февраля 2020

Опция 1: Object.

class Scene {
 int fps = 60;
 float duration;
 Object simulation;
}

Опция 2: интерфейс Simulation, который реализует Simulation1 и Simulation2.

class Scene {
 int fps = 60;
 float duration;
 ISimulation simulation;
}

Опция 3: Тип c тип T

class Scene<T> {
 int fps = 60;
 float duration;
 T simulation;
}
1 голос
/ 23 февраля 2020

Похоже, вы ищете дженерики, которые заключаются в скобки angular, например, List<String>. Кроме того, если у ваших классов симуляции есть общие методы, я бы создал интерфейс симуляции, а симуляции 1 и 2 реализовали его. Вы можете сделать обобщение расширенным интерфейсом, например так: class Scene<T extends Simulation> Затем используйте тип T, как если бы это был тип переменной типа String.

...