2

我在我的 force.com 应用程序中使用 Apex 类,其中许多具有相同的结构,我想制作一个 API 以在之后重用它。

例如,这是两个类:

//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

1 回答 1

4

你的意思是你想编写适用于不同类型对象的代码,而不是在代码中说明对象的类型?

可以通过使用 sObject 类型声明 sObject 变量来做到这一点,例如,而不是

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

你会放

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

并通过使用 get 和 put 引用字段,例如,而不是

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

你会放

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

我没有尝试在控制器扩展中使用这样的代码,但理论上因为你可以传入任何标准控制器,你应该没问题。

您需要考虑如何在 save 方法中创建父对象,因为您需要传入要创建的类型。这很复杂,但可以接受一个表示对象类型的字符串(例如“帐户”)并创建一个该类型的新对象:

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

将为您提供一个新帐户。因此,您可以将“帐户”替换为作为参数传入的任何类型。

有关更多信息,请查看文档中的 Dynamic Apex、Dynamic SOQL 和 Dynamic DML。

一个警告:将对象类型和字段名称作为字符串传递意味着编译器将不知道代码中提到了这些类型。因此,如果您尝试删除自定义对象或重命名字段,Salesforce 不会警告您该对象或字段正在使用中,而是允许您进行删除。

另一个警告:虽然这允许代码重用并且这是一个好处,但您可能会发现它不值得。除非绝对必须,否则我会避免编写动态顶点。它比普通的 apex 复杂得多,因此难以调试和维护,尤其是在必须由您以外的人维护时。

于 2012-05-14T13:12:12.447 回答