在C#中使用泛型,具有“递归”关系

时间:2013-12-05 21:45:10

标签: c# generics

我正在尝试在C#中实现主/从关系(基本上Master有一个从属列表,每个Slave只有一个master),在Java中我可以这样做:

class Master<S extends Slave> {

}

class Slave<M extends Master> {

}

但是,C#中的等价成语:

class Master<S> where S:Slave {

}

class Slave<M> where M:Master {

}

不编译,因为它要求我在where条件下使用泛型,我不知道如何指定这个确切的类型;怎么办呢?

此外,我如何实现一个既是集合的主服务器又是另一个主服务器的从服务器的类(因为C# - 和Java就此而言 - 没有多重继承)?

类似的东西:

class MasterSlave<M,S>: Master<M>, Slave<S> {

}

由于

3 个答案:

答案 0 :(得分:4)

class Master<M, S> where S : Slave<S, M> where M : Master<M, S>

答案 1 :(得分:2)

如果您的设置完全符合您的要求,那么因为您没有常规的,非通用的MasterSlave课程。但是,您可以这样做:

class Master
{

}

class Master<S> : Master
    where S : Slave
{

}

class Slave
{

}

class Slave<M> : Slave
    where M : Master
{

}

然后一个假设的MasterSlave类看起来像这样:

class MasterSlave<M,S>: 
    where M : Master
    where S : Slave
{

}

(注意,正如下面的评论中指出的,你也可以在这里使用接口而不是非泛型类)

这可能看起来多余,但相信我,当实际创建类的实例时,它将比替代方案简单得多。

但是,根据您的初步目标,我不确定您为什么需要泛型:

  

我试图在C#中实现主/从关系(基本上主人有一个奴隶列表,每个奴隶只有一个主人

听起来你只是想尝试实现简单的一对多关系,这可以通过以下方式实现:

class Master
{
    List<Slave> Slaves { get; set; }
}

class Slave
{
    Master Master { get; set; }
}

答案 2 :(得分:0)

如果我理解“(基本上Master有一个Slave列表,每个Slave只有一个master)”,这是简单的继承:

class Master { ... }

class Slave : Master {...}
class Slave2 : Master {...}

// Instantiate:
Master master;
Slave slave;

master = new Master();
slave = new Slave2();
slave = new Slave();

我通常会将其编码为:

class Master { ... }
class abstract Slave : Master {...}
class Slave1 : Slave {...}
class Slave2 : Slave {...}

所以我可以将功能放入Slave类中,但不能实例化它。