2015-07-19 89 views
0

假设三个类:Class1,Class2和Class3加上一个变量值。Java:我可以为同一个变量获取不同的类实例吗?

我希望做的是这样的:

??? value; 
switch (someInt) { 
    case 1: value = new Class1(); break; 
    case 2: value = new Class2(); break; 
    case 3: value = new Class3(); break; 
}  

我期待JavaFX中使用此构建这是许多getter和setter类似的各种类,但在数也不同(因此不同的类名都是从同一个父类派生的)。

是否有某种方式实现上述?

我已经评估了一些问题的答案,但我还是不能完全看到回答我的问题,所以这里是一个具体的例子:

这里有三个班,我想分配到阴影(我知道我不能像这样做,它只是为了举例说明):

Shadow shadow; 
DropShadow shadow; 
InnerShadow shadow; 

switch (sType) { 
    case "SHADOW" : shadow = new Shadow(); break; 
    case "DROPSHADOW" : shadow = new DropShadow(); break; 
    case "INNERSHADOW" : shadow = new InnerShadow(); break; 
} 

// All these classes share the same parameters 

shadow.setColor(Color.BLACK); 
.... 
shadow.setRadius(2.0); 

fieldContent.setEffect(shadow); 
// This will then set any one of the three shadows 
+2

为了不把OOP概念扔在废纸篓中,3个类应该共享某种类型(如果只有相同的接口),然后将值变为此类型的变量。如果您创建值类型为Object的对象,那么您就会遇到麻烦。 –

+2

是的,您可以使用'Object value;'或任何类型,它是所有三个类的超类型。 – Codebender

+0

这些显然是相互矛盾的答案。你们有谁能解释你的答案吗? – Frank

回答

0

当然。 Java中的所有类都默认Object作为他们的根,所以你可以有

Object value; 

//... 
switch (someInt) { 
    case 1: value = new Class1(); break; 
    case 2: value = new Class2(); break; 
    case 3: value = new Class3(); break; 
} 

或者,如果所有的类都实现或者扩展其它一些功能:

public interface AwesomeClass { 
    public void method(); 
} 

public class Class1 implements AwesomeClass { 
    public void method() { 
     // do class1 thing 
    } 
} 

public class Class2 implements AwesomeClass { 
    public void method() { 
     // do class2 thing 
    } 
} 

// ... 

AwesomeClass value; 
switch (someInt) { 
    case 1: value = new Class1(); break; 
    case 2: value = new Class2(); break; 
} 

这里是另外一个例子,如果类扩展底座class

public class Animal { 
    public void eat() { } 

    public void walk() { } 
} 

public class Cat extends Animal { 
    public void eat() { 
     // eat like a cat 
    } 

    public void walk() { 
     // walk like a cat (on four legs) 
    } 

public class Horse extends Animal { 
    public void eat() { 
     // eat like a horse 
    } 

    public void walk() { 
     // walk like a horse 
    } 
} 

Animal myAnimal; 
switch(typeOfAnimal) { 
    case 1: myAnimal = new Cat(); break; 
    case 2: myAnimal = new Horse(); break; 
} 
0

如果Class1Class2Class3实现共同的接口,或者扩展一个共同的基类,你可以使用它。发布后,您可以使用所有Java实例的共同祖先(Object)。您还需要break报表,因为case(s)发生跌落。像,

Object value; 
switch (someInt) { 
case 1: 
    value = new Class1(); 
    break; 
case 2: 
    value = new Class2(); 
    break; 
case 3: 
    value = new Class3(); 
    break; 
} 
相关问题