簡體   English   中英

C#交叉引用泛型類

[英]C# cross referencing generic classes

我希望兩個泛型類能夠相互引用。 我似乎無法編譯任何東西。 試過這個:

class Program
{
    static void Main(string[] args)
    {
    }

    public class ClassA<BT> where BT: ClassB<ClassA<BT>>
    {
        BT btvar;
    }

    public class ClassB<AT> where AT: ClassA<ClassB<AT>>
    {
        AT atvar;
    }
}

這是一個實際的實現,但是我想避免對自己的代碼進行復雜的解釋。 我可以創建符合規則的封閉類,但似乎無法為這些封閉實例描述通用類或接口。

據我所知,這是不可能的,這就是為什么:

您想要A,模板類型為B。您想要B,模板值為類型A。

如果創建A的新實例,則編譯器必須檢查T的類型是否為B。要檢查它的類型是否為B,則必須檢查B的類型是否為A,A的類型是否為B,等等。

您最終會創建一個無限循環。

我最終完成此操作的方法是將類添加為自己的類型參數之一。 它不是很漂亮,但是可以。

public abstract class Saver<TSaver, TData>
    where TSaver : Saver<TSaver, TData>
    where TData : ISaveable<TData, TSaver>
{ ... }

public interface ISaveable<TData, TSaver>
    where TData : ISaveable<TData, TSaver>
    where TSaver : Saver<TSaver, TData>
{ ... }

public class WorkspaceWindow : ScalingWindow, ISaveable<WorkspaceWindow, WorkspaceWindowSaver>
{ ... }

public class WorkspaceWindowSaver : Saver<WorkspaceWindowSaver, WorkspaceWindow>
{ ... }

這是可能的,以下基於此問題的答案。

public class ClassA<BT, AT> :
    where BT : ClassB<AT, BT>
    where AT : ClassA<BT, AT>
{
    BT btvar;
}

public class ClassB<AT, BT> :
    where BT : ClassB<AT, BT>
    where AT : ClassA<BT, AT>   
{
    AT atvar;
}

您將無法直接使用這些類,需要覆蓋它們。

public ClassAImp : ClassA<ClassBImp, ClassAImp>
public ClassBImp : ClassB<ClassAImp, ClassBImp>

因此,您也可以使ClassA和ClassB抽象。

這將進行編譯,但是我希望您實例化ClassA或ClassB:

    public class ClassA<TBt>  where TBt : ClassB<TBt>
    {
        TBt _btvar;
    }

    public class ClassB<TAt> : ClassA<TAt> where TAt : ClassB<TAt>
    {
        TAt _atvar;
    }

“你為什么要?” 聽起來對我來說是個好問題。 泛型的要點是允許您抽象一個類以允許它使用多種類型。 如果約束將類型限制為具體類型,則僅允許該類型及其子類。 如果您不對子類執行此操作,請不要使用泛型。 如果是的話,如何使用界面?

public interface IClassA<ITB> { }

public interface IClassB<ITA> { }

public class ClassA<AT,BT> : IClassA<BT> where BT : IClassB<AT>
{
    BT btvar;
}

public class ClassB<BT,AT> : IClassB<AT> where AT : IClassA<BT>
{
    AT atvar;
}

public class ClassADerivedClosed : ClassA<ClassADerivedClosed, ClassBDerivedClosed> { }

public class ClassBDerivedClosed : ClassB<ClassBDerivedClosed, ClassADerivedClosed> { }

暫無
暫無

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

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