簡體   English   中英

在C#中使用具有“遞歸”關系的泛型

[英]Using generics in C# with a “recursive” relationship

我正在嘗試在C#中實現主/從關系(基本上,一個主具有一個從屬列表,每個從屬只有一個主控),而在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> {

}

謝謝

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

如果您的設置與您列出的完全相同,那是因為您沒有常規的,非通用的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; }
}

如果我正確理解“(基本上一個主節點有一個從節點列表,每個從節點只有一個主節點)”,這就是簡單的繼承:

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類中,但不能實例化它。

暫無
暫無

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

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