簡體   English   中英

C# - 覆蓋泛型抽象方法的泛型類型約束

[英]C# - Override generic type constraints of generic abstract methods

是否可以覆蓋 generics 約束以實現抽象方法?

讓我解釋一下......通常我會做類似的事情:

public abstract class A
{
    public abstract class IData {}

    public abstract void DoSomething(IData data);
}

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething(IData data)
    {
        DataB d = data as DataB;

        if (d == null)
        {
             // print error or whatever...
             return;
        }

        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething(IData data)
    {
        DataC d = data as DataC;

        if (d == null)
        {
             // print error or whatever...
             return;
        }

        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

我不喜歡的是我可以將無效的參數類型傳遞給DoSomething function。

我希望能夠做類似的事情

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething(DataB data)
    {
        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething(DataC data)
    {
        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

這當然是不可能的。

出於這個原因,我最終做了類似的事情:

public abstract class A
{
    public abstract class IData {}

    public abstract void DoSomething<T>(T data) where T : IData;
}

下一步將是制作類似的東西

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething<T>(T data) where T : DataB
    {
        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething<T>(T data) where T : DataC
    {
        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

所以,基本上,覆蓋我在父抽象泛型方法中設置的泛型約束。 有沒有辦法做到這一點?

請注意:我不想創建一個通用的 class,但只創建一個通用方法,它能夠根據基本 class 的每個不同實現獲取正確類型的數據。

顯然,我想要實現的目標目前在 C# 中是不可能的。 等了一會兒看看是否有解決方法后,我決定引用 JasperKent 的評論作為最終答案:

語言根本不允許這樣做。 請參閱: docs.microsoft.com/en-us/dotnet/csharp/misc/cs0460

顯然它在您編碼時不受支持。 但您可以嘗試不同的編碼,如下所示:

public abstract void DoSomething<T, TConstraint>(T data) where T : TConstraint;

....

public override void DoSomething<T, DataB>(T data){ //your code here; }
....

public override void DoSomething<T, DataC>(T data){ //your code here; }

暫無
暫無

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

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