[英]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.