[英]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>
如果您的設置與您列出的完全相同,那是因為您沒有常規的,非通用的Master
和Slave
類。 但是,您可以執行以下操作:
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.