[英]Java inheritance - how to set value from instance of child class to be shared (same) by other child classes?
[英]How to create an instance of a class from a set of classes?
我有一个类似类的列表,这些类都是同一抽象类的所有子类。 我也有一个布尔数组,应该与应使用的类相对应。
例如,我有一堆类,它们使用以下约定命名:
boolean[] classesOn = new boolean[4];
abstract class myClass {}
class myClass1 extends myClass { public void myClass1(float x, float y) ...}
class myClass2 extends myClass {}
class myClass3 extends myClass {}
class myClass4 extends myClass {}
...
想法是只使用classesOn
中具有相应布尔值的类。 为此,我使用了一个for
循环,该循环遍历classesOn
并检查是否为true
。 现在我有以下代码:
for (int i = 0; i < classesOn.length; i++) {
if (classesOn[i]) {
switch (i) {
case 0: c = new myClass1(x, y); break;
case 1: c = new myClass2(x, y); break;
...
现在这是非常低效的,并且当我添加myClass
新扩展时,我需要添加一个新案例。 我只想说if (classesOn[i]) { c = new "myClass" + (i + 1) ();}
创建该特定类的实例。
我怎样才能做到这一点?
(顺便说一下,这些只是示例,每个类的实际实现差异很大)
我当前正在使用的用途实际上是在Processing中,其中在一个类中代表着多种配色方案。 但是我很好奇将来如何在所有类型的类中执行此操作。
我现在正在使用的确切代码如下所示(但我对总体答案很感兴趣)
abstract class Scheme {
float red,blue,green,x,y;
String description;
public void mousespot(){
this.x = mouseX;
this.y = mouseY;
return;
}
public float getRed(){
return this.red;
}
public float getBlue(){
return this.blue;
}
public float getGreen(){
return this.green;
}
public String getDescription(){
fill(255,255,255);
textSize(32);
return this.description;
}
}
class Scheme1 extends Scheme {
public Scheme1(float x, float y) {
this.description = "Green-Yellow-GW-Turqouise";
this.red = map(x, 0, width, 0, 255);
this.blue = map(y, 0, height, 0, 255);
this.green = 255 * (float) dist(width/2, height/2, x, y) / (x / y);
}
}
class Scheme2 extends Scheme {
public Scheme2(float x, float y) {
this.description = "Red-Yellow-Peach-Magenta";
this.green = map(x, 0, width, 0, 255);
this.blue = map(y, 0, height, 0, 255);
this.red = 255 * (float) dist(width/2, height/2, x, y) / (x / y);
}
}
并在mouseDragged()
方法中:
for (i = 0; i < colorschemesOn.length;i++) {
if (colorschemesOn[i]) {
switch(i) {
case 0:
public Scheme selectedScheme = new Scheme1(mouseX,mouseY);
break;
case 1:
public Scheme selectedScheme = new Scheme2(mouseX,mouseY);
break;
case 2:
public Scheme selectedScheme = new Scheme3(mouseX,mouseY);
break;
case 3:
public Scheme selectedScheme = new Scheme4(mouseX,mouseY);
break;
case 4:
public Scheme selectedScheme = new Scheme5(mouseX,mouseY);
break;
case 5:
public Scheme selectedScheme = new Scheme6(mouseX,mouseY);
break;
case 6:
public Scheme selectedScheme = new Scheme7(mouseX,mouseY);
break;
case 7:
public Scheme selectedScheme = new Scheme8(mouseX,mouseY);
break;
case 8:
public Scheme selectedScheme = new Scheme9(mouseX,mouseY);
break;
case 9:
public Scheme selectedScheme = new Scheme10(mouseX,mouseY);
break;
case 10:
public Scheme selectedScheme = new Scheme11(mouseX,mouseY);
break;
case 11:
public Scheme selectedScheme = new Scheme12(mouseX,mouseY);
break;
default:
public Scheme selectedScheme = new Scheme1(mouseX,mouseY);
break;
}
}
}
不要依赖命名约定,而是创建一个数组:
Class<? extends myClass>[] classes = new Class<? extends myClass>[] {
myClass1.class, myClass2.class, myClass3.class, myClass4.class
};
boolean[] classesOn = new boolean[classes.length];
然后,您可以使用反射实例化它们:
if (classesOn[i]) { myClass c = classes[i].getConstructor().newInstance(); }
如果您的构造函数接受参数:
myClass c;
if (i < classesOn.lenght && classesOn[i]) {
c = classes[i]
.getConstructor(float.class, float.class)
.newInstance(mouseX, mouseY);
} else {
c = new myClass1(mouseX, mouseY);
}
您可以使用反射
if (classesOn[i]) { c = Class.forName("myClass" + (i + 1)).newInstance(); }
这很少是一个好主意,通常有更好的方法来构造您的类/代码,这意味着您不需要它。
一种更优雅的方法可能是使用Reflections库。 (不要与内置的混淆)
它支持通过注释或接口等查询类。 您可以获取它来查找myClass
所有子类,无论它们是什么名称或它们所在的JAR。
如果构造函数接受两个参数,则可以将两个参数传递给它。
if (classesOn[i]) {
c = Class.forName("myClass" + (i + 1))
.getConstructor(float.class, float.class)
.newInstance(mouseX, mouseY);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.