我目前正在学习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.";
}
感谢您的帮助!
答案 0 :(得分:3)
无法将通用类限制为int
和string
。
int
和string
不共享任何对其唯一的公共基类或接口int
是struct
而string
是class
- 所以即使按struct
/ class
约束缩小选择也是不可能的。 所以基本上没有类型约束的通用(如果确实需要,可能在运行时检查类型)是这两种类型可以获得的最佳通用类型。对于不限制类型参数的泛型,没有什么特别的错误(即List<T>
)。
如果你想要缩小类型至少int
和string
确实有一些共享接口 - IComparable
,IConvertible
(非通用一次),但这些接口由所有数字类型实现,例如。
注意:有类似的问题试图将泛型限制为“数字类型”,这可能会提供一些替代方法(包括代码生成)。即Is there a constraint that restricts my generic method to numeric types?
答案 1 :(得分:2)
可能或多或少做你所要求的事情;但正如其他人已经指出的那样,你可能不会想要这样做(甚至可能不会需要约束)。但是,正如我在评论中指出的那样,你创建了一个界面
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." });
}
}
再次,虽然这给你一个&#34;解决方案&#34;对于您的具体问题,您可能会考虑这种方法的智慧。