首先,我調整您的代碼一點點,
1-我創建了一個接口,數據,含有一些隨機方法的someMethod():
package main.interfaces;
public interface Data {
int myData = 0;
public void someMethod();
}
2-然後,我創建2類稱爲DataOne和DataTwo: 類DataOne :(注意我是如何在這裏添加重要的業務方法setImportantData(),這提供了總計封裝你的工作)。
package main;
import main.interfaces.Data;
public class DataOne implements Data{
public int importantData;
public int getImportantData() {
return importantData;
}
public void setImportantData(int importantData) {
this.importantData = importantData;
}
@Override
public void someMethod() {
System.out.println("here in DataOne!... ");
}
public void calculateImportantData(int importantData) {
// int importantData = 1234567890;
setImportantData(importantData);
}
}
類DataTwo:
package main;
import main.interfaces.Data;
public class DataTwo implements Data{
public int notSoImportantData;
@Override
public void someMethod() {
System.out.println("here in DataTwo!...");
}
public void calculateUsualData(DataTwo d2) {
d2.someMethod();
}
}後
,使用工廠設計模式 ...我創建了這個DataFactory類:
package main.factory;
import main.DataOne;
import main.DataTwo;
import main.interfaces.Data;
public class DataFactory {
public static Data getData(String dataType){
if(dataType == null){
return null;
}
if(dataType.equalsIgnoreCase("DATAONE")){
return new DataOne();
} else if(dataType.equalsIgnoreCase("DATATWO")){
return new DataTwo();
}
return null;
}
}
現在,回到您的問題解決方案,我使用DataHolder封裝DataFact ORY這裏:
package main.holder;
import main.factory.DataFactory;
import main.interfaces.Data;
public class DataHolder {
Data data;
public DataHolder(String dataType){
data = DataFactory.getData(dataType);
}
public Data getData(){
return data;
}
}
現在,嘗試運行應用程序,我補充說,將出現在控制檯上的一些意見,我希望他們會有所幫助:)
package main.run;
import main.DataOne;
import main.DataTwo;
import main.holder.DataHolder;
import main.interfaces.Data;
public class main {
public static void main(String[] args) {
// lets assume user of the method passed a DataOne Object, you can
// manage it by changing the value of flag string
String flag = "DataOne";
DataHolder dataHolder = new DataHolder(flag);
if (dataHolder.getData() instanceof DataOne) {
System.out
.println("you have a DataOne object , but a Data reference");
System.out
.println("/nso , you need to create a 'reference' to DataOne to work on that object ...");
} else if (dataHolder.getData() instanceof DataTwo) {
System.out
.println("you have a DataTwo object , but a Data reference");
} else {
System.out
.println("you dont have a DataOne nor DataTwo references , it is a "
+ dataHolder.getData().getClass() + " object!");
}
System.out
.println("in order for the compiler to pass the following test , you must cast he RHS (right hand side) to match the LHS (left hand side)");
// in order for the compiler to pass the following test , you must cast
// the RHS (right hand side) to match the LHS (left hand side)
DataOne d1 = (DataOne) dataHolder.getData();
// in case you wanted to test DataTwo scenario
//DataTwo d2 = (DataTwo) dataHolder.getData();
System.out.println("if you didnt do that , you can make it a Data Object , but you will not be able to access the method 'getImportantData()' created in DataOne");
Data data = dataHolder.getData();
}
}
(注意,這裏的程序結構是:在啓動應用程序之前選擇數據的類型,存儲在main方法內的「flag」變量中。之後,將調用DataHolder方法,之後,您可以檢查返回的對象並檢查它是否是您之前指定的內容。如果你希望它有點複雜,你可以在DataHolder的構造函數中傳遞對象類型,並從那裏進行檢查,我不想僅僅爲了簡單起見。好運)
那麼,你定義的東西的方式不能包含*廣告DataOne或DataTwo,因爲既不是從數據派生。 – 2014-10-16 15:57:06
如果您需要採用'DataHolder'的方法,則不需要。 (忽略代碼片段中缺少'implements',我認爲這是一個疏忽。) – 2014-10-16 15:57:07
類聲明後面有一些奇怪的'()',我也認爲它是錯別字。 – aioobe 2014-10-16 16:01:50