簡體   English   中英

如何使用一組密封類創建模板

[英]How to create template with a set of sealed class

我有一些無法重寫的代碼密封的類。 (因此,我不能使這些類實現相同的接口)。

我有幾個函數可以為此類提供相同的功能:

void fN(int i, sealedClassN sc)
{
    list.Add(new delegateCreator(sc));
    button.Click += list.[i]._delegate;
}        

(當然也實現了proxyCreator(SealedClassN)(但是不使用模板,因為每次的操作都非常不同))

我想創建一個:

void f<sealedClass >(int i, sealedClass sc) with sealedClass : sealedClass1or or sealedClass2 or sealedClass3 ....
{
    list.Add(new delegateCreator(sc));
    button.Click += list.[i]._delegate;
}        

有沒有辦法做到這一點。 謝謝您的幫助

我認為您無法做到。 T : T1 or T2 ...問題是您沒有為參數設置共享成員。 考慮一下

public class Type1
{
    public void M()
    {
    }
}

public class Type2
{
    public void M()
    {
    }
}

public static class Extension
{
    public static void A<T>(T obj) where T : Type1 or Type2
    {
        obj.M();
    }
}

這兩個類都有一個方法M()但對於編譯器來說是不一樣的,因為它們沒有聲明此方法的共享類型。

不幸的是,這不是直接可能的。 我可以建議以下替代方法:

選項1:改為傳遞一個delegateCreator

// call as fN(i, new delegateCreator(sc))
//
void fN(int i, delegateCreator dc)
{
    list.Add(dc);
    button.Click += list.[i]._delegate;
}      

選項2:如果您有一個更復雜的函數,它只能有條件地創建一個delegateCreator創建器,則可以傳遞一個lambda表達式作為參數:

// call as fN(i, () => new delegateCreator(sc))
//
void fN(int i, Func<delegateCreator> dcfunc)
{
    if (someCondition)
    {
        list.Add(dcfunc.Invoke());
        button.Click += list.[i]._delegate;
    }
}      

暫無
暫無

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

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