2012-05-14 173 views
2

我在我的force.com應用程序Apex Classes中使用,它們中的許多具有相同的結構,我希望在API之後重用它。創建我自己的API

的exaple,這是兩個類:

//first class 

public class insererActAct{ 

public List<Activites_actuelles__c> accts {get; set;} 

public insererActAct(ApexPages.StandardController controller){ 
    accts = new List<Activites_actuelles__c>(); 
    accts.add(new Activites_actuelles__c()); 
} 

public void addrow(){ 
    accts.add(new Activites_actuelles__c()); 

} 

public PageReference deleteRow(){ 
    if (accts.size()>1) 
    { 
     accts.remove(accts.size()-1); 
    } 
    return null; 
} 

public PageReference save() 
{ 
    insert accts; 
    Assure__c theParent = new Assure__c(id=accts[0].Activites_actuelles__c); 
    PageReference acctPage = new ApexPages.StandardController(theParent).view(); 
    acctPage.setRedirect(true); 
    return acctPage; 
} 
} 

//second class 

public class insererEnfants{ 

public List<Enfants__c> accts {get; set;} 

public insererEnfants(ApexPages.StandardController controller){ 
    accts = new List<Enfants__c>(); 
    accts.add(new Enfants__c()); 
} 

public void addrow(){ 
    accts.add(new Enfants__c()); 

} 

public PageReference deleteRow(){ 
    if (accts.size()>1) 
    { 
     accts.remove(accts.size()-1); 
    } 
    return null; 
} 

public PageReference save() 
{ 
    insert accts; 
    Assure__c theParent = new Assure__c(id=accts[0].Parent__c); 
    PageReference acctPage = new ApexPages.StandardController(theParent).view(); 
    acctPage.setRedirect(true); 
    return acctPage; 
} 
} 

任何一個可以告訴我這是可以或不可以,如果是的話,我怎麼能做到這一點嗎?

回答

4

你的意思是你想編寫適用於不同類型對象的代碼,而不是在代碼中聲明對象的類型?

這是可能做到這一點,通過與的sObject類型聲明你的sObject變量,例如,而不是

public List<Activites_actuelles__c> accts {get; set;} 

你會

public List<sObject> sObjects{get; set;} 

,並通過引用字段使用得到,並把放,例如而不是

Account theAccount = new Account(); 
theAccount.name = 'Fred'; 

你會把

sObject theSObject = new SObject(); 
theSObject.put('name', 'Fred'); 

我不是在一個控制器擴展使用這樣的代碼試過,但在理論上,因爲你可以在你應該是OK的任何標準控制器通過。

您將需要考慮如何在save方法內創建父對象,因爲您需要傳遞您想要創建的類型。這是相當複雜的,但它可能採取在代表對象類型(例如「帳戶」)的字符串,並創建該類型的新對象:

Schema.getGlobalDescribe().get('Account').newSObject() 

將讓你一個新的帳戶。因此,您可以用作爲參數傳入的任何類型替換「帳戶」。

欲瞭解更多信息,請查閱文檔中的Dynamic Apex,Dynamic SOQL和Dynamic DML。

一句警告:以字符串形式傳遞對象類型和字段名稱意味着編譯器不會知道代碼中提到的那些類型。因此,如果您嘗試刪除自定義對象或重命名字段,salesforce不會警告您該對象或字段正在使用中,並且允許您執行刪除操作。

警告的另一個詞:雖然這允許代碼重用,這是一種好處,但您可能會發現它不值得。除非我絕對必須,否則我會避免寫出動態頂點。它比普通的頂點要複雜得多,因此很難調試和維護,尤其是當你以外的人需要維護時。

+0

謝謝你的幫助和澄清! – Netmaster

+0

我有一個其他問題,我怎麼能自動插入主關係字段的值在兒童,因爲我有一個父母每個孩子? – Netmaster

+0

你可能可以用getDescribe()來做複雜的事情來找出父對象是什麼類型的對象(不確定是否可能),但我認爲保留對象類型名稱在自定義設置中會更容易字符串)。 – naomi