2015-07-19 95 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; 
} 
相關問題