簡體   English   中英

從非泛型基類調用泛型方法/委托

[英]Invoking generic method/delegate from a non-generic base class

我覺得我不是從正確的角度看待這個問題,而我只是沒有考慮其他解決方案。

假設這個泛型類;

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<>[]會成為一件事。

我覺得我錯過了什么......

使Port<T>使用顯式實現實現非通用接口IPort 以這種方式,它隱藏在API之外,但仍然允許您調用泛型類中的方法。

public interface IPort
{
    object SomeAction(object data);
}

public class Port<T> : IPort
{
    //[.. all other methods ..]


    object IPort.SomeAction(object data)
    {
        var typedData = (T)data;
        //invoke our typed version.
        return SomeAction(data);
    }

    public T SomeAction(T data)
    {
         // ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM