簡體   English   中英

使用抽象類的泛型函數

[英]Generic function using an abstract class

我正在嘗試創建一個靜態函數,將一個抽象類的實例替換為另一個實例。 (我簡化了代碼,將重點放在無法正常工作的地方):

abstract class AbstractData
{
    public int MaxValue;
    public int[] GivenValues;
}

static class AnalyzeData
{
    static void Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData
    {
        T.GivenValues = abstractData.GivenValues; //error : T is a type parameter which is not valid in the given context
        T.MaxValue= abstractData.GivenValues[0]; // same error
        foreach (var data in abstractData.GivenValues)
        {
           if (data<limitValue){
               T.MaxValue = data;
           }
        }
        abstractData = T; //same error
    }
}

我試圖在函數的定義中用AbstractData替換T,或強制轉換T,但沒有一個起作用。

我發現的唯一解決方案是使用Abstract Data的另一個實例作為參數(並具有“ in”和“ out”實例):

static void Analyze<T>(int limitValue, AbstractData abstractDataIn, AbstractData abstractDataOut)

但是,那時我將失去該函數通用部分的優勢。

您知道我為什么會有這個錯誤,以及如何糾正它嗎?

謝謝 !

TType ,不是Type的實例。 如果要創建並返回新實例,則必須這樣編寫:

static T Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData, new()
{
    T t = new T();
    t.GivenValues = abstractData.GivenValues;
    t.MaxValue= abstractData.GivenValues[0];
    foreach (var data in abstractData.GivenValues)
    {
       if (data<limitValue){
           t.MaxValue = data;
       }
    }
    return t;
}

您的返回值類型為T

另一個選擇是傳遞T的實例:

static void Analyze<T>(int limitValue, AbstractData abstractData, T t) where T : AbstractData
{
    t.GivenValues = abstractData.GivenValues;
    t.MaxValue= abstractData.GivenValues[0];
    foreach (var data in abstractData.GivenValues)
    {
       if (data<limitValue){
           t.MaxValue = data;
       }
    }
}

這樣就無需return新創建的實例。

暫無
暫無

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

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