簡體   English   中英

如何使用可處理整數或字符串值的泛型創建抽象基類?

[英]How can I create an abstract base class with a generic that can handle either an integer or string value?

我目前正在學習C#,並且遇到一種情況,我想擁有一個其他類將繼承的基本抽象類。

我的挑戰是我想根據情況傳入整數或字符串值。

目前,我可以使用通用IF來實現此目的,而我不限制通用。 但是,我認為不限制通用名稱可能是一個壞習慣? 而且如果這是一個不好的做法,我將如何約束泛型,以便只使用整數或字符串。

這是我要執行的操作的一個示例:

/*
I want to have a base abstract class that can handle
both an integer value and a string value
*/
public abstract class Characteristic<T> where T : int, string {
    private T _value;

    public T Value {
        get { return _value;}
        set { _value = value;}
    }
}

public class NumericAttribute : Characteristic<int> {
    private int _modifiedValue = Value + 1;
}

public class StringAttribute : Characteristic<string> {
    private string _modifiedValue = Value + " more text.";
}

謝謝你的幫助!

將通用類限制為僅intstring是不可能的。

  • 沒有“僅這些類”約束
  • intstring不共享任何唯一的公共基類或接口
  • int是一個structstring是一個class -因此,即使通過struct / class約束來縮小選擇范圍也是不可能的。

因此,基本上沒有類型約束的通用類型(如果確實需要,可以在運行時檢查類型)是使用這兩種類型可以獲得的最佳通用類型。 沒有約束它們鍵入參數的泛型沒有什么特別的錯誤(即List<T> )。

如果要縮小類型的范圍,至少要有一點intstring的確有一些共享的接口IComparableIConvertible (一次非泛型),但是這些接口例如由所有數字類型實現。

注意:存在類似的問題試圖將泛型限制為“數字類型”,這可能會提供一些替代方法(包括代碼生成)。 是否存在將我的通用方法限制為數字類型的約束?

可以或多或少地執行您的要求; 但是正如其他人已經指出的那樣,您可能不想這樣做(甚至可能不需要約束)。 但是,正如我在評論中指出的那樣,您可以創建一個界面

public interface IModifiable<T>
{
    T Modify(T value);
}

然后是您自己的用於實現此接口的intstring的包裝器類:

public struct Int32 : IModifiable<Int32>
{
    public System.Int32 Value { get; set; }

    public Int32 Modify(Int32 value)
    {
        return new Int32() { Value = Value + value.Value };
    }
}

public class String : IModifiable<String>
{
    public System.String Value { get; set; }

    public String Modify(String value)
    {
        return new String() { Value = Value + value.Value };
    }
}

現在,您的基類具有接口的約束

public abstract class Characteristic<T> where T : IModifiable<T>
{
    private T _value;

    public T Value
    {
        get { return _value; }
        set { _value = value; }
    }
}

和您的派生類,幾乎和以前一樣

public class NumericAttribute : Characteristic<Int32>
{
    void f()
    {
        var _modifiedValue = Value.Modify(new Int32() { Value = 1 });
    }
}

public class StringAttribute : Characteristic<String>
{
    void f()
    {
        var _modifiedValue = Value.Modify(new String() { Value = " more text." });
    }
}

同樣,盡管這為您提供了針對特定問題的“解決方案”,但您可能會考慮這種方法的智慧。

暫無
暫無

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

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