繁体   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