从非泛型基类调用泛型方法/委托

时间:2016-01-12 18:11:00

标签: c# generics

我觉得我不是从正确的角度来看待这个问题,我只是没有考虑其他解决方案。

假设这个通用类;

public abstract class Port<T>
{
    public delegate T PullDelegate();

    private PullDelegate pull;

    public Port(PullDelegate pull)
    {
        this.pull = pull;
    }

    public T Pull()
    {
        return pull();
    }
}

它用于在图形节点编辑器中定义“端口”。端口可以​​将对象/值从一个节点传输到另一个节点,但它们也需要“类型安全”,这意味着我不能将任何端口插入另一个错误类型的端口(至少没有一些转换)。

节点“拥有”一个端口并为其一个方法赋予它一个委托,所以当另一个节点“拉”一个值时,该端口只是调用它并返回正确的值。

当我尝试从非泛型集合中调用Pull()时,我的问题就开始了。显然,我可以创建一个非泛型的基本方法,但是然后Pull无法返回T,它需要返回object

此外,每个节点都有其端口的集合访问器,因此其他项目可以获取它们。该收集必须是非泛型的,因为一个节点可以有许多类型的许多端口。

    public abstract Port[] Inputs { get; }
    public abstract Port[] Outputs { get; }
    public abstract Port[] Entries { get; }
    public abstract Port[] Exits { get; }

当非泛型类型发挥作用时,通用的一切都变得无法访问。如果只有Port<>[]就是一件事。

我觉得我错过了什么......

1 个答案:

答案 0 :(得分:1)

使用显式实现使<cfscript> variables.File_Obj = createObject("java", "java.io.File"); variables.HTTP_Transport = createObject("java", "com.google.api.client.http.javanet.NetHttpTransport").init(); variables.JSON_Factory = createObject("java", "com.google.api.client.json.jackson2.JacksonFactory").init(); variables.HTTP_Request_Initializer = createObject("java", "com.google.api.client.http.HttpRequestInitializer"); variables.Offline_Credential_Builder = createObject("java", "com.google.api.ads.common.lib.auth.OfflineCredentials$Builder"); variables.API = createObject("java", "com.google.api.ads.common.lib.auth.OfflineCredentials$Api"); variables.adwordsService = createObject("java", "com.google.api.ads.adwords.axis.factory.AdWordsServices").init(); variables.Budget = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.Budget"); variables.BudgetBudgetDeliveryMethod = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.BudgetBudgetDeliveryMethod"); variables.BudgetBudgetPeriod = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.BudgetBudgetPeriod"); variables.BudgetServiceInterface = createObject("java", "com.google.api.ads.adwords.axis.v201509.cm.BudgetServiceInterface"); variables.Money = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.Money"); variables.adsession_builder = createObject("java", "com.google.api.ads.adwords.lib.client.AdWordsSession$Builder"); oAuth2Credential = Offline_Credential_Builder .forApi(Api.ADWORDS) .fromFile(variables.File_Obj.Init(expandPath('ads.properties'))) .build() .generateCredential(); session = adsession_builder.fromFile(expandPath('ads.properties')) .withOAuth2Credential(oAuth2Credential) .build(); adwordsService.get(session, BudgetServiceInterface) </cfscript> 实现非泛型接口Port<T>。以这种方式,它隐藏在API中,但仍然允许您调用泛型类中的方法。

IPort