2012-04-20 18 views
1

使用openedge 10.2.b ItemObj.clsIn Progress-4GL如何設置對象以接受不同數量的輸入?

CLASS mystuff.ItemObj : 
    METHOD PUBLIC CHARACTER GetItemDesc 
    (INPUT pcOne AS CHARACTER, 
    INPUT pcTwo AS CHARACTER, 
    INPUT piThree AS INTEGER) : 

    RETURN pcOne pcTwo pcThree. 

END METHOD. 

ItemObj.p

USING mystuff.*. 
DEFINE VARIABLE rItemObj AS CLASS mystuff.ItemObj NO-UNDO. 
rItemObj = NEW mystuff.ItemObj(). 
MESSAGE "One : " rItemObj:GetItemDesc (1)  SKIP(1) 
     "Two : " rItemObj:GetItemDesc (1, 2) SKIP(1) 
     "Three : " rItemObj:GetItemDesc (1, 2, 3) VIEW-AS ALERT-BOX INFO. 
DELETE OBJECT rItemObj. 

我希望所有這些語句的輸出,使得如果用戶輸入只輸入1的是相同的另外兩個默認爲2和3,如果用戶輸入1和2相同,三是默認爲3

如何做到這一點沒有得到一個不匹配參數錯誤?

回答

3

IIRC進展不允許在方法定義的可選參數,所以你必須創建每個參數置換的方法定義或接受處理多個值作爲像動態數組,臨時表的參數的數據結構或自定義對象並解壓縮(但是然後你將邏輯推到你的調用者上)。

CLASS mystuff.ItemObj: 
    METHOD PUBLIC CHARACTER GetItemDesc (INPUT pcOne AS CHARACTER, 
             INPUT pcTwo AS CHARACTER, 
             INPUT piThree AS INTEGER): 
    RETURN pcOne pcTwo pcThree. 
    END METHOD. 

    METHOD PUBLIC CHARACTER GetItemDesc (INPUT pcOne AS CHARACTER, 
             INPUT pcTwo AS CHARACTER): 
    RETURN GetItemDesc(pcOne, pcTwo, 3). 
    END METHOD. 

    METHOD PUBLIC CHARACTER GetItemDesc (INPUT pcOne AS CHARACTER): 
    RETURN GetItemDesc(pcOne, "2"). 
    END METHOD. 
END CLASS. 
+0

你會如何處理這個問題?我真的不想支持同一個對象的三個不同版本。使用運輸對象有優勢嗎? – Bill 2012-04-20 15:32:12

+0

動態陣列/臨時表的解決方案是可能不是非常好,因爲IIRC你只能有針對整個數據結構的單一類型(例如,僅'INTEGER'或'CHARACTER',沒有混合)。你可以做一些愚蠢的喜歡只是使用'Object'作爲類型,並根據它在何種程度上在運行時垂頭喪氣值到特定的類型,但是... EWW。我會使用我90%的時間提供的解決方案,在其他需要複雜性的情況下,創建一些類型的「選項」對象並接受它。最好的長期解決方案是找到比使用Progress更好的語言。 ;) – 2012-04-20 15:44:04

+0

另外,如果這個代碼將永遠只能在Windows上運行,那麼您可能能夠通過使用CLR橋寫的東西'.NET'更加靈活。但我沒有任何經驗,對不起。 – 2012-04-20 15:46:44

相關問題