c#是否可以将泛型抽象类的单个参数限制为两个不同的用户定义类型?

本文关键字:两个 类型 定义 用户 是否 泛型 抽象类 参数 单个 | 更新日期: 2023-09-27 18:06:38

首先我要感谢所有帮助我的人,我不是一个很好的程序员,我几乎没有开始用c#编程。我的目标是开发一种用于信号处理的IDE,并隐藏编码的大部分细节

abstract public class DSPdata<DSPtype> 
        where DSPtype : DSPComplex, DSPReal
{
    // Restrict DSPtype to be real or complex
}
public class DSPReal : DSPdata<DSPReal>
{
    // Implement functionality of DSPReal 
}
public class DSPComplex : DSPdata<DSPComplex>
{
}
我得到了这个参考,但我不是很清楚。https://msdn.microsoft.com/en-us/library/d5x73970.aspx我为我的英语写作和编程道歉。我希望我能得到一些帮助C

c#是否可以将泛型抽象类的单个参数限制为两个不同的用户定义类型?

是的,你想做的是可能的。你的实现实际上做了一些稍微不同的事情。它将泛型DSPtype限制为既是DSPComplex又是DSPReal的类型。我相信您要做的是将泛型DSPtype限制为DSPComplex或DSPReal。

要做到这一点,你应该使用一个接口做这样的事情:

abstract public class DSPdata< DSPtype > 
    where DSPtype : IDSPdata {
   // Restrict DSPtype to be real or complex
}
public class DSPReal : IDSPdata
   // Implement functionality of DSPReal 
}
public class DSPComplex : IDSPdata
{
}
public interface IDSPdata 
{
    // Add whatever must appear in DSPtype for it to work here
}

虽然Cameron说的是正确的,但请记住c#不允许多重继承,因此不允许对多个类型(不是接口!)进行类型约束。类型约束只允许将约束定义为连接。当然,你可以在约束中有多个接口,c#允许该类型实现任意数量的接口。

间接实现的一种方法是在基类中引入内部构造函数,并结合稍微修改的泛型约束。

使用内部构造函数时,不能在另一个程序集中创建实例。因此,如果您可以在同一个单独的程序集中定义DSPData<T>类型和DSPRealDSPComplex类型,那么您可以防止在其他程序集中创建任何其他类型。

// Assembly A
public abstract class DSPData<DSPType>
    where DSPType : DSPData<DSPType>
{
    internal DSPData() { }
}
public class DSPReal : DSPData<DSPReal>
{
    public DSPReal() { }
}
public class DSPComplex : DSPData<DSPComplex>
{
    public DSPComplex() { }
}
// Assembly B, references assembly A
// Doesn't compile
public class DSPTest : DSPData<DSPTest>
{
    public DSPTest() { }
}