[英]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.";
}
謝謝你的幫助!
將通用類限制為僅int
和string
是不可能的。
int
和string
不共享任何唯一的公共基類或接口 int
是一個struct
而string
是一個class
-因此,即使通過struct
/ class
約束來縮小選擇范圍也是不可能的。 因此,基本上沒有類型約束的通用類型(如果確實需要,可以在運行時檢查類型)是使用這兩種類型可以獲得的最佳通用類型。 沒有約束它們鍵入參數的泛型沒有什么特別的錯誤(即List<T>
)。
如果要縮小類型的范圍,至少要有一點int
和string
的確有一些共享的接口IComparable
, IConvertible
(一次非泛型),但是這些接口例如由所有數字類型實現。
注意:存在類似的問題試圖將泛型限制為“數字類型”,這可能會提供一些替代方法(包括代碼生成)。 即是否存在將我的通用方法限制為數字類型的約束?
可以或多或少地執行您的要求; 但是正如其他人已經指出的那樣,您可能不想這樣做(甚至可能不需要約束)。 但是,正如我在評論中指出的那樣,您可以創建一個界面
public interface IModifiable<T>
{
T Modify(T value);
}
然后是您自己的用於實現此接口的int
和string
的包裝器類:
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.